字典实现:python-----VS----java
对比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的更多相关文章
- Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用
目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...
- paip.判断文件是否存在uapi python php java c#
paip.判断文件是否存在uapi python php java c# ==========uapi file_exists exists() 面向对象风格: File.Exists 作者: 老哇 ...
- paip.web数据绑定 下拉框的api设计 选择框 uapi python .net java swing jsf总结
paip.web数据绑定 下拉框的api设计 选择框 uapi python .net java swing jsf总结 ====总结: 数据绑定下拉框,Uapi 1.最好的是默认绑定..Map(k ...
- MongoDB的账户与权限管理及在Python与Java中的登陆
本文主要介绍了MongoDB的账户新建,权限管理(简单的),以及在Python,Java和默认客户端中的登陆. 默认的MongoDB是没有账户权限管理的,也就是说,不需要密码即可登陆,即可拥有读写的权 ...
- 谈谈Python、Java与AI
Python好像天生是为AI而生的,随着AI的火热,特别是用Python写的TensorFlow越来越火,Python的热度越来越高,就像当年Java就是随着互联网火起来的感觉.在我的工作中,Pyth ...
- [翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能
[翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能 原文: Comparing AWS Lambda performance of Node.js, ...
- Python和Java的硬盘夜话
这是一个程序员的电脑硬盘,在一个叫做"学习"的目录下曾经生活着两个小程序,一个叫做Hello.java,即Java小子:另外一个叫做hello.c ,也就是C老头儿. C老头儿的命 ...
- 将来会是Python、Java、Golang三足鼎立的局面吗?
甲:听说最近java跌落神坛,python称霸武林了,你知道吗? 乙:不是吧,我前几天看python怎么还是第三? 丙:你们都在扯蛋,python在2018年就已经是最好的语言了! 乙:不可能吧? 甲 ...
- python、java读数据
python从txt文档中读数据有个特别神奇的函数 可以把txt文档中的数据直接读取成python数组 java用Scanner类读数据比较方便
- python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样
python与java的内存机制不一样;java的方法会进入方法区直到对象消失 方法才会消失;python的方法是对象每次调用都会创建新的对象 内存地址都不i一样
随机推荐
- python+request+unittest+HTMLTestRunner
https://www.imooc.com/article/details/id/20813 https://www.cnblogs.com/fennudexiaoniao/p/7771931.htm ...
- 「生产事故」MongoDB复合索引引发的灾难
前情提要 11月末我司商品服务的MongoDB主库曾出现过严重抖动.频繁锁库等情况. 由于诸多业务存在插入MongoDB.然后立即查询等逻辑,因此项目并未开启读写分离. 最终定位问题是由于:服务器自身 ...
- js数组去重方法集合
//第一种方法,新建一个空数组,将原来的数组循环逐个与新数组的成员做比较,如果新数组没有该元素就push进来 var arr = ['a', 1, 1, 1, 2, 4, 4, 'b', 'c', ' ...
- 美国SEC主席离任,Panda Global 前瞻数字资产监管政策变化
在上上个周末,也就是6月20号,美国的证券行业发生了一件值得反复回味的的事情--美国SEC现任主席Jay Clayton宣布即将离任,对于数字资产行业而言,未来监管政策将如何演变突然有了无限的遐想空间 ...
- GYM100526I Interesting Integers
题目大意 定义一种 \(Gabonacci\) 数列: \[\begin{array}{c} G_1=a\\ G_2=b\\ G_i=G_{i-1}+G_{i-2} \end{array} \] 给定 ...
- http请求user_agent字段解析
浏览器的常见User Agent 各字段的解释 浏览器的User Agent字段令人迷惑,例如:某一版本的Chrome访问网络时,User Agent字段如下: Mozilla/5.0 (Window ...
- sql 执行语句函数
# sql 语句执行函数 def get_access(request): uid=request cursor=connection.cursor() cursor.execute("se ...
- MySQL最经典50道练习题
表名和字段 学生表 Student(s_id,s_name,s_birth,s_sex):学生编号.学生姓名.出生年月.学生性别. 课程表 Course(c_id,c_name,t_id):课程编号. ...
- 树莓派了解Linux基本命令
本节我们来了解一些基本的Linux命令(在树莓派上操作),看完之后,当你再面对Linux黑黑的命令框时至少不会不知所措,你可以用这些基本的命令完成一些需要的操作,比如查找.编辑.查看文件,查看基本的系 ...
- github无法访问解决方法
windows 系统下找到目录 C:\Windows\System32\drivers\etc 打开 hosts 文件 添加以下配置 #github140.82.114.3 github.com 保存 ...