听说你在等我的ARTS

掐指一算,这应该是祖国妈妈生日之前最后一篇关于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
  1. 哈希算法

看来对于查找,我已经知道了套路的第二步,就是用哈希算法来进行。那么,第一步是什么呢?就是刚做这类查找题,必然会想到的暴力解。

采用哈希算法,是因为之前毕竟也做了好多个,从一开始的没想到,到后来的可能有用,到现在的一看到题目就先去考虑,也算是一大进步。

还是老样子,因为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学习的同学一点帮助。

都是插入数据

  1. 对于数据库中没有该字段,两者没有区别

  2. 对于数据库中有该字段,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

「奔跑吧攻城狮」感谢大家的关注,现在后台回复「设计模式」赠你小编精心挑选设计模式书籍。小编想打造一个高质量交流群,回复「加群」即可解锁,也可直接微信(xuyue4087)私聊解锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小跃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值