掐指一算,这应该是祖国妈妈生日之前最后一篇关于ARTS的打卡系列。每次周四,都感觉自己压力好大,准备资料、写算法肯定都得提前做,不然周四当天,我肯定没法完成。
如果把时间调整到非周四,大家还在调整一周的最佳状态,往后推又都在状态下滑期。我太难了,所以,我觉得周四是最佳的碎片化学习时间,你们觉得呢。在你精神最佳的时候,我奉献上如此高质量的小文,贴心吧。
我可以让你提高下算法的思路;让你持续学习英语;让你收获一个优秀的tip;让你看一篇优秀好文……哇哦,想想都开心的不要不要。燥起来!!!
Algorithm LeetCode算法
求众数https://leetcode-cn.com/problems/majority-element/
)
题目描述:给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例1:
输入: [3,2,3]
输出: 3
示例2:
输入: [2,2,1,1,1,2,2]
输出: 2
哈希算法
看来对于查找,我已经知道了套路的第二步,就是用哈希算法来进行。那么,第一步是什么呢?就是刚做这类查找题,必然会想到的暴力解。
采用哈希算法,是因为之前毕竟也做了好多个,从一开始的没想到,到后来的可能有用,到现在的一看到题目就先去考虑,也算是一大进步。
还是老样子,因为HashMap的Key是不允许重复的。所以,你可以在执行数据查找的时候,利用这个特点来进行。先存入一个数据,value存储出现的次数。遇到重复的,把value值依次加1即可。最后遍历这个HashMap就可以找到想要的答案了。
具体的做法,其实很简单,参考如下即可。就是时间和空间复杂度不友好,都是O(n)。
public static int majorityElement(int[] nums) {
int result = 0;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i = 0;i < nums.length; i++) {
if (map.containsKey(nums[i])) {
map.put(nums[i], map.get(nums[i]) + 1);
} else {
map.put(nums[i], 1);
}
}
int count = nums.length / 2;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() > count) {
result = entry.getKey();
break;
}
}
return result;
}
2 参考
https://leetcode-cn.com/problems/majority-element/solution/qiu-zhong-shu-by-leetcode-2/
原本以为,这个题只是一个简单的做法,但是小编偷偷去瞄了一眼官方题解,那个激动啊,真的真的很激动。
为啥呢,因为这个题,有多达6种解法,代码最少的解法,你们猜需要多少行代码?给你五秒钟。
5,4,3,2,1 时间到,知悉算法的你知道吗?哈哈,利用先排序,后查询的办法,只要2行代码。
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
做算法真的是一件开心的事情,起先你可能不会,迷茫;然后你开始冥思苦想,绞尽脑汁我到底该如何学习算法;接着你学会了特点,开始照猫画虎;你已经学到该类题目的特色。算法就是一步步提升你的思维,开心不?
Review 阅读并点评至少一篇英文文章
How to Build Good Softwarehttps://www.csc.gov.sg/articles/how-to-build-good-software?utm_source=wanqu.co&utm_campaign=Wanqu+Daily&utm_medium=website
)
还是遗留上周的这篇,这个作者的老爸是谁吗?是新加坡总理李显龙。
作者名叫李鸿毅,曾获得公共服务委员会海外优异奖学金,赴美国麻省理工学院攻读经济学,之后在谷歌工作过两年,任产品经理。所以,他查看的角度和大局观,都是优秀的角度,值得我再次品味一番。
具体的分析,上周已经说的差不多了,这周就是温故知新。也是节前的一次偷懒之举吧。接触到了政府级的软件开发角度,还是很赞的噢。希望你也能再看一遍,欢迎和我交流。
Tip 一个技术技巧
这期先暂停一下关于Linux技巧的分享。因为我有先学的东西要拿出来,那就是mongodb的知识。
最近在学习mongodb,肯定需要插入,结果看到有save()和insert()这两种操作,很是纳闷,为什么需要两种方式来表示插入呢?
接下来就来聊聊这两个的异同点,希望能给mongodb学习的同学一点帮助。
都是插入数据
对于数据库中没有该字段,两者没有区别
对于数据库中有该字段,insert会报错,save会执行更新操作
若新增的数据中存在主键,insert()会提示错误,而save()则更改原来的内容为新内容
区别
若新增的数据中存在主键,insert()会提示错误,而save()则更改原来的内容为新内容
已存在数据:{_id:11,"username":"user1"},然后继续进行插入操作的话,此时
insert({_id:11,"username":"user2"})
会抛出主键重复的错误提示org.springframework.dao.DuplicateKeyException
并且不保存当前的数据
save({_id:11,"username":"user2"})
user2的内容会覆盖user1
相同点
如果新增的数据中没有主键时,会增加一条记录
已存在数据:{_id:11,"username":"user1"},再次进行插入操作时,
insert({"username":"user2"}) 插入的数据因为没有主键,所以会增加一条数据
save({"username":"user2"}) 增加一条数据,_id 不一样
所以,对于mongodb的插入,你了解了没?关于mongodb,后续应该会有一个小系列,走起。
Share 一篇有观点和思考的技术文章
设计模式走起来。
公众号地址:设计模式之迭代器与组合模式(三)
推荐阅读:
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/36e0606f9c106798401270e75f4d1cc2.jpeg)
「奔跑吧攻城狮」感谢大家的关注,现在后台回复「设计模式」赠你小编精心挑选设计模式书籍。小编想打造一个高质量交流群,回复「加群」即可解锁,也可直接微信(xuyue4087)私聊解锁。