对比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. Spring Cloud微服务学习笔记

    Spring Cloud微服务学习笔记 SOA->Dubbo 微服务架构->Spring Cloud提供了一个一站式的微服务解决方案 第一部分 微服务架构 1 互联网应用架构发展 那些迫使 ...

  2. webstorm2017.02版本如何使用material theme

    本想废话一番,表达对material theme的喜欢.还是直接说方法吧~ file-settings-Plugins-Browse repositories-搜索 material theme -选 ...

  3. Python 表达式 i += x 与 i = i + x 等价吗?

    Python 表达式 i += x 与 i = i + x 等价吗? 看个例子 a = [1, 2, 3] b = a # 写法一 b += [4] # 写法二 # b = b + [4] print ...

  4. 二、初步认识LoadRunner工具

    LoadRunner工具有三个组成分别是: Virtual User Generator:用户行为模拟:录制运行脚本. Controller:上面的录制一个用户操作,这个可以将其克隆成多个用户,模拟多 ...

  5. 微信小程序api拦截器

    微信小程序api拦截器 完美兼容原生小程序项目 完美兼用小程序api的原本调用方式,无痛迁移 小程序api全Promise化 和axios一样的请求方式 小程序api自定义拦截调用参数和返回结果 强大 ...

  6. 设计模式——责任链(结合Tomcat中Filter机制)

    设计模式:责任链模式 说责任链之前,先引入一个场景,假如规定学生请假小于或等于 2 天,班主任可以批准:小于或等于 7 天,系主任可以批准:小于或等于 10 天,院长可以批准:其他情况不予批准:以此为 ...

  7. Java与C#的代码区别

    Java和C#都是编程的语言,它们是两个不同方向的两种语言 相同点: 他们都是面向对象的语言,也就是说,它们都能实现面向对象的思想(封装,继承,多态) 区别: 1.c#中的命名空间是namespace ...

  8. 5.装饰模式 Decorator (单一职责)

    结合: Android设计模式 006 装饰者模式  [B站]对整个重构的细节讲的容易懂 Android的设计模式-装饰者模式   [简书]结合安卓源码讲的还可以,让我对context有更深入的理解 ...

  9. 前后端分离项目获取后端跨控制器获取不到session

    最近做前后端分离项目(.net core web api  +vue)时,后台跨控制器不能获取到session.由于配置的是共享的session.本来以为是共享session出了问题,就在共享sess ...

  10. Demo分享丨看ModelArts与HiLens是如何让车自己跑起来的

    摘要:基于HiLens Kit已经基本开发完成,可部署到HiLens Kit,模型的选择为基于DarkNet53的YOLOv3模型,权重为基于COCO2014训练的数据集,而车道线的检测是基于Open ...