对比python和java的字典数据结构,以下就LeetCode面试题 17.10. 主要元素为栗子,进行学习。是一道简单题目,重点看数据结构的运用与实现。

普通的思路,使用一个字典结构记录每个元素出现的次数,然后判别每个元素出现次数是否超过数组长度的一半(绝对大于)。

python实现dict:我们可以看到,非常简单灵活,而又清晰

 1 class Solution:
2 def majorityElement(self, nums: List[int]) -> int:
3 if not nums: return -1
4 hashtable = {}
5 n = len(nums)
6 for i in range(n):
7 if nums[i] not in hashtable.keys():
8 hashtable[nums[i]] = 1
9 else:
10 hashtable[nums[i]] += 1
11 if hashtable[nums[i]] > n//2:
12 return nums[i]
13 return -1

java使用HashMap实现dict逻辑:重点要注意HashMapde的定义,Integer不能写成int(亲测会报错)。判断元素是否存在使用HashMap.containsKey()函数;得到相应元素使用get函数,改变指定元素使用put函数。

 1 class Solution {
2 public int majorityElement(int[] nums) {
3 HashMap<Integer, Integer> hashtable = new HashMap<>();
4 int n = nums.length;
5 for(int i = 0; i < n; i++){
6 if (hashtable.containsKey(nums[i])){
7 int tmp = hashtable.get(nums[i]);
8 tmp++;
9 hashtable.put(nums[i], tmp);
10 }else{
11 hashtable.put(nums[i], 1);
12 }
13 if(hashtable.get(nums[i]) > n/2){
14 return nums[i];
15 }
16 }
17 return -1;
18 }
19 }

第三行代码可以使用Map(父类)进行定义:

Map<Integer, Integer> hashtable = new HashMap<>();

发现了java更简洁的写法,使用了HashMap中的getOrDefault方法。

 1 class Solution {
2 public int majorityElement(int[] nums) {
3 Map<Integer,Integer> map=new HashMap<>();
4 for(int i=0;i<nums.length;i++) {
5 map.put(nums[i], map.getOrDefault(nums[i],0)+1);
6 if(map.get(nums[i])>nums.length/2)return nums[i];
7 }
8 return -1;
9
10 }
11 }
12
13 作者:camile8
14 链接:https://leetcode-cn.com/problems/find-majority-element-lcci/solution/zhi-xing-yong-shi-20-msnei-cun-xiao-hao-442-mb-by-/
15 来源:力扣(LeetCode)
16 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

小小台阶:题目有个小进阶,如下图

首先做个井底之蛙,不看大佬的算法讲解,先排序,然后使用pre和count进行元素数量的记录,最后判断,因为排序最小的时间复杂度是nlog(n),因此需要进行算法优化啦,:

 1 class Solution:
2 def majorityElement(self, nums: List[int]) -> int:
3 nums.sort()
4 if not nums: return -1
5 pre = nums[0]
6 index = 1
7 count = 1
8 while index < len(nums):
9 if nums[index] == pre:
10 count += 1
11 else:
12 pre = nums[index]
13 count = 1
14 index += 1
15 if count > len(nums)//2:
16 return pre
17 if count > len(nums)//2:
18 return pre
19 return -1

java实现:java实现涉及几个知识点,首先,java的排序,然后呢,java的for循环数组遍历。这里呢,我们对list进行排序,使用Arrays类的sort方法。

 1 class Solution {
2 public int majorityElement(int[] nums) {
3 Arrays.sort(nums);
4 if(nums == null){return -1;}
5 int pre = nums[0], count = 1;
6 for(int i = 1; i < nums.length; i++){
7 if(nums[i] == pre){
8 count++;
9 }else{
10 pre = nums[i];
11 count = 1;
12 }
13 if (count > nums.length/2){
14 return nums[i];
15 }
16 }
17 if (count > nums.length/2){
18 return pre;
19 }
20 return -1;
21 }
22 }

算法优化:利用找众数的思想,“世界男人分两种,我和我以外的”,特殊情况下[1, 2, 2, 3, 3, 3],需要进行验证,存在的众数数量是否大于总量一半。

python代码:

 1 class Solution:
2 def majorityElement(self, nums: List[int]) -> int:
3 n = len(nums)
4 if n==0: return -1
5 tmp, count = nums[0], 1
6 for i in range(1, n):
7 if nums[i] == tmp:
8 count += 1
9 else:
10 count -= 1
11 if count == 0:
12 tmp = nums[i]
13 count = 1
14 if count==0: return -1
15 half_num = n //2 + 1
16 count = 0
17 for i in range(n):
18 if nums[i] == tmp:
19 count += 1
20 if count == half_num:
21 return tmp
22 return -1

java代码:

 1 class Solution {
2 public int majorityElement(int[] nums) {
3 int n = nums.length;
4 if(n==0){return -1;}
5 int tmp = nums[0], count = 1;
6 for(int i = 1; i < n; i++){
7 if(nums[i]==tmp){
8 count++;
9 }
10 else{
11 count--;
12 }
13 if(count==0){
14 tmp = nums[i];
15 count = 1;
16 }
17 }
18 if(count == 0){ return -1;}
19 int half_n = n/2 + 1;
20 count = 0;
21 for(int i = 0; i < n; i++){
22 if(nums[i] == tmp){count++;}
23 if(count==half_n){
24 return tmp;
25 }
26 }
27 return -1;
28 }
29 }

字典实现:python-----VS----java的更多相关文章

  1. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  2. paip.判断文件是否存在uapi python php java c#

    paip.判断文件是否存在uapi python php java c# ==========uapi file_exists exists() 面向对象风格:  File.Exists 作者: 老哇 ...

  3. paip.web数据绑定 下拉框的api设计 选择框 uapi python .net java swing jsf总结

    paip.web数据绑定 下拉框的api设计 选择框 uapi  python .net java swing jsf总结 ====总结: 数据绑定下拉框,Uapi 1.最好的是默认绑定..Map(k ...

  4. MongoDB的账户与权限管理及在Python与Java中的登陆

    本文主要介绍了MongoDB的账户新建,权限管理(简单的),以及在Python,Java和默认客户端中的登陆. 默认的MongoDB是没有账户权限管理的,也就是说,不需要密码即可登陆,即可拥有读写的权 ...

  5. 谈谈Python、Java与AI

    Python好像天生是为AI而生的,随着AI的火热,特别是用Python写的TensorFlow越来越火,Python的热度越来越高,就像当年Java就是随着互联网火起来的感觉.在我的工作中,Pyth ...

  6. [翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能

    [翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能 原文: Comparing AWS Lambda performance of Node.js, ...

  7. Python和Java的硬盘夜话

    这是一个程序员的电脑硬盘,在一个叫做"学习"的目录下曾经生活着两个小程序,一个叫做Hello.java,即Java小子:另外一个叫做hello.c ,也就是C老头儿. C老头儿的命 ...

  8. 将来会是Python、Java、Golang三足鼎立的局面吗?

    甲:听说最近java跌落神坛,python称霸武林了,你知道吗? 乙:不是吧,我前几天看python怎么还是第三? 丙:你们都在扯蛋,python在2018年就已经是最好的语言了! 乙:不可能吧? 甲 ...

  9. python、java读数据

    python从txt文档中读数据有个特别神奇的函数 可以把txt文档中的数据直接读取成python数组 java用Scanner类读数据比较方便

  10. python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

    python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样

随机推荐

  1. [SUCTF 2019]Game

    buuoj杂项复现 下载了之后给了我们一张图片了网站的源代码 图片简单分析了之后没有什么内容,先看源代码的index.html 里面有base32编码,解码 ON2WG5DGPNUECSDBNBQV6 ...

  2. NET CORE通过NodeService调用js

    在 .NET Framework 时,我们可以通过V8.NET等组件来运行 JavaScript,不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core ,我们如何在 .NET C ...

  3. AcWing 406. 放置机器人

    大型补档计划 题目链接 预处理每个列.行连续块. 每个每个列行只能在一个位置匹配,否则冲突. 符合二分图性质,跑匈牙利即可. 点数最坏情况 \(N * M\) (墙空地相间分布),边数最坏情况 \(N ...

  4. 题解-[NOI2005]瑰丽华尔兹

    题解-[NOI2005]瑰丽华尔兹 [NOI2005]瑰丽华尔兹 \(n\times m\) 的矩阵.以 \((x,y)\) 为起点.一共 \(k\) 段时间,每段时间为 \([s_i,t_i](t_ ...

  5. HBuilder云端打包+个推

    1.个推上登记应用. 应用名称和应用标识,在HBuilder的云端打包配置中获取. 应用证书:必需要有苹果开发者账号,并且加入了"iOS Developer Program".加入 ...

  6. STL——容器(Map & multimap)的排序与遍历

    1. Map & multimap 的排序与遍历 map<T1,T2,less<T1> >  mapA; //该容器是按键的升序方式排列元素.如果未指定less< ...

  7. ES6中的Promise和Generator详解

    目录 简介 Promise 什么是Promise Promise的特点 Promise的优点 Promise的缺点 Promise的用法 Promise的执行顺序 Promise.prototype. ...

  8. react第X单元(redux)

    第X单元(redux) #课程目标 理解redux解决的问题,理解redux的工作原理 熟练掌握redux的api 熟练掌握redux和react组件之间的通信(react-redux) 把redux ...

  9. PHP MySQL 快速导入10万条数据

    项目背景 数据来源:所有数据均为外部导入,最大数据量在10w+ 输出数据:导出经过业务处理之后的数据 使用框架:fastadmin 涉及的问题: 1.数据读取 2.数据保存 使用数据:10w+ 解决方 ...

  10. 302跳转导致的url劫持

    介绍一个   网站监测工具:iis7网站监测IIS7网站监控工具可以做到提前预防各类网站劫持,并且是免费在线查询,适用于各大站长,政府网站,学校,公司,医院等网站.它可以做到24小时定时监控,同时它可 ...