字典实现: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一样
随机推荐
- W12Scan和taoman批量刷edusrc(单机)
昨天看到教育漏洞群里面发了利用w12scan和taoman两个开源工具批量刷edusrc的帖子链接, https://www.bugku.com/thread-3810-1-1.html 跟着帖子上面 ...
- SQL Server 批量插入数据方案 SqlBulkCopy 的简单封装,让批量插入更方便
一.Sql Server插入方案介绍 关于 SqlServer 批量插入的方式,有三种比较常用的插入方式,Insert.BatchInsert.SqlBulkCopy,下面我们对比以下三种方案的速度 ...
- buuctf-[网鼎杯 2018]Fakebook 1
这道题,也是费了很大的劲,慢慢理解慢慢消化,今天,才开始把wp写出来 首先我们先扫描一波目录,用dirsearch扫一手,发现有robots.txt文件 dirseach自带的字典在db目录下,使用格 ...
- 【题解】The Great Divide [Uva10256]
[题解]The Great Divide [Uva10256] 传送门:\(\text{The Great Divide [Uva10256]}\) [题目描述] 输入多组数据,每组数据给定 \(n\ ...
- 学习笔记:Link Cut Tree
模板题 原理 类似树链剖分对重儿子/长儿子剖分,Link Cut Tree 也做的是类似的链剖分. 每个节点选出 \(0 / 1\) 个儿子作为实儿子,剩下是虚儿子.对应的边是实边/虚边,虚实时可以进 ...
- AcWing 317. 陨石的秘密
1 -> {} 2 -> [] 3 -> () \(f[d][a][b][c]\) 表示 \([i * 2 - 1, j * 2]\) 这段区间 深度为 d \(1\) 有 \(a\ ...
- 我的第一次shell
我的第一次shell 最近我们的项目需要进行优化,整体架构进行改造. 然后我们红超哥就看我骨骼惊奇,说小伙子你想不想当做掌门人呀.(我说不想哈哈) 想不想也没用了,红超哥说我们现在的架构有所改变,需要 ...
- 参数文件恢复:RMAN-0617
RMAN> restore spfile from autobackup; Starting restore at 03-APR-19using channel ORA_DISK_1using ...
- 除了MD5加密,试一下签名吧
需求 MD5加密,简单密码用彩虹表很容易破解. 密码不能被暴力破解,可以根据定制字符,时间戳等防止破解 解决方案 签名 密码加密 源码 const crypto = require('crypto') ...
- 解决虚拟机联网问题linux VMware eth0
虚拟机坏了n多回,真是让我装机装到吐血,经过两天的折腾终于弄明白怎么配置虚拟机的静态ip了. 方法: 1. 将虚拟机关机,--> 打开编辑 ->点击 虚拟网络映射 ->点击 VMne ...