字典实现: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一样
随机推荐
- 【软件测试部署基础】maven的认识
最近部门分享测试环境部署相关内容,在同事的分享下,学到了很多新的知识点,也是我们在测试环境部署的时候非常重要的一些基本的知识点,当你系统的去了解了一下,你会发现后端在maven相关的点上有个清晰的了解 ...
- scrapy爬虫登录edusrc查看漏洞列表
scrapy登录界面的难点在于登录时候的验证码,我们通过使用scrapy.FormRequest向目标网站提交数据(表单提交),同时将验证码显示在本地,手动输入,进而登录. 验证码是类似于这种的,才可 ...
- git 常用命令 command 1.0(本地 local repository 对远程仓库 remote repository 的操作)
输入 q 退出 日志界面
- 我摊牌了,大厂面试Linux就这5个问题
说真的,这就是<我想进大厂>系列第八篇,但是Linux的问题确实很少,就这样,强行编几个没有营养的问题也没啥意义. 1.CPU负载和CPU利用率的区别是什么? 首先,我们可以通过uptim ...
- AcWing 330. 估算
大型补档计划 题目链接 若 \(K = 1\),显然,\(B[i]\) 取 \(A\) 序列的中位数时最优. 考虑扩展,我们只需要把 \(A\) 分成 \(K\) 段,每段内, \(B\) 最优的取值 ...
- Robot Framework+adb框架自动化测试Android设备案例⑸——L1层测试用例
一.L1层测试用例 1.初始化.robot *** Settings *** Resource ../L2层关键字.robot *** Test Cases *** 切换EMMC模式 [Tags] A ...
- 搭建docker registry私有镜像仓库
搭建docker registry私有镜像仓库 一.安装docker-distribution yum install -y docker-distribution 安装完成后,启动服务: syste ...
- sqli-labs 54-65(CHALLANGES)
challenges less-54 less-55 less-56 less-57 less-58 less-59 less-60 less-61 less-62 less-63 less-64 l ...
- Electron安装打包指南
当前环境Debian Linux-Deepin 安装Node 直接下载 命令下载 下载 wget https://nodejs.org/dist/v14.15.1/node-v14.15.1-linu ...
- centos 7系统安装mysql 8.0
一.关闭防火墙 [root@node01 ~]# systemctl disable firewalld [root@node01 ~]# systemctl stop firewalld [root ...