上周因为版本的改版,投入了比较多的时间,又恰逢中秋,结果就把打卡给鸽了,实在有点对不住大家。
但是有朋友鼓励我,还是在等待着我的更新,所以,这周我又回来了。坚持一种习惯,不能偷懒,不然,哪天开始,你都不知道自己还曾拥有过这么好的习惯。
一起写作课的同学,有的上了头条的青云奖,有的公众号阅读量已经很高,而我还在原地踏步中,向我优秀的同学看齐,还需要多多努力。
Algorithm LeetCode算法
只出现一次的数字
(https://leetcode-cn.com/problems/single-number/
)
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例1:
输入: [2,2,1]
输出: 1
示例2:
输入: [4,1,2,1,2]
输出: 4
- HashMap 解法
拿到这个题目,其实之前也做过几个类似的,判断是否有重复的。那第一反应就是用HashMap来做。为什么?
因为HashMap的Key是不允许重复的。所以,你可以在执行数据查找的时候,利用这个特点来进行。先存入一个数据,遇到重复的,把这个重复的key删除即可,那最后留下的Map只有一直数,就是你想要的数据。
具体的做法,其实很简单,参考如下即可。就是时间和空间复杂度不友好,都是O(n)。
public static int singleNumber(int[] nums) {
int result = 0;
if (nums == null || nums.length == 0) {
return 0;
}
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
map.remove(nums[i]);
} else {
map.put(nums[i], nums[i]);
}
}
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
result = entry.getValue();
}
return result;
}
- 异或解法
当然了,每个题目出来,总有他一个特点,以及一个优秀的解法。
在这里,这个解法就是采用异或的方式。针对题目,我们有以下几个特点可以参考:
1. 交换律:a ^ b ^ c <=> a ^ c ^ b
2. 任何数于0异或为任何数 0 ^ n => n
3. 相同的数异或为0: n ^ n => 0
所以,这解法就一目了然了,为什么用异或,你看懂了吗?
public static int singleNumber1(int[] nums) {
int result = 0;
for (int num : nums) {
result ^= num;
}
return result;
}
除了这两种解法,其实还有暴力循环,快速排序或者更多的方式,在这里就不一一说明了,读者们可以自行去查找。
Review 阅读并点评至少一篇英文文章
How to Build Good Software
(https://www.csc.gov.sg/articles/how-to-build-good-software?utm_source=wanqu.co&utm_campaign=Wanqu+Daily&utm_medium=website
)
这是写给新加坡公务员看的。标题咋看之下貌不惊人,实际上是一篇相当有水平的深入浅出的软件工程佳作,金句不断。如果你有几年的工作经验了,读起来会颇有共鸣。
作者是 MIT 计算机系毕业,以前在 Google 做过 PM。作者的弟弟也是 MIT 计算机系毕业,在 Scala 圈子里颇有名气。他们的父亲 C++ 代码写得不错,声称退休后打算读一下 Haskell 教科书。
文中出现的金句很多,我在这里分享部分给大家:
- Why Bad Software Happens to Good People
- The root cause of bad software has less to do with specific engineering choices, and more to do with how development projects are managed.
- Reusing Software Lets You Build Good Things Quickly
- Software engineering is about building automated systems, and one of the first things that gets automated away is routine software engineering work.
- Software Is Limited by Complexity
- Building good software involves alternating cycles of expanding and reducing complexity.
- Software Is about Developing Knowledge More than Writing Code
- Software should be treated not as a static product, but as a living manifestation of the development team’s collective understanding.
3 Principles for Good Software Development
- Start as Simple as Possible
- Seek Out Problems and Iterate
- Hire the Best Engineers You Can
所以,这篇文章也让我看到了新加坡那边的编码要求以及一些习惯,看上去,其实都是大同小异。比如提到尽可能的去实践,找出并迭代问题,降低复杂度,扩展程序。这些能力,无论你在哪,哪怕是天涯海角,都是每个程序员必备的技能。
Tip 一个技术技巧
前面两期,都介绍了Linux常用命令的其中5种,我每次都给出5个,也让大家好消化一点,毕竟这个只有实际操作过才知道。
今天介绍11-15.
- xargs 将所有图片文件拷贝到外部驱动器
$ ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
将系统中所有jpd文件压缩打包
$ find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
下载文件中列出的所有url对应的页面
$ cat url-list.txt | xargs wget –c
- ls 以易读的方式显示文件大小(显示为MB,GB…)
$ ls -lh
-rw-r----- 1 ramesh team-dev 8.9M Jun 12 15:27 arch-linux.txt.gz
以最后修改时间升序列出文件
$ ls -ltr
在文件名后面显示文件类型
$ ls -F
-
pwd 输出当前工作目录
-
cd cd -可以在最近工作的两个目录间切换
使用shopt -s cdspell可以设置自动对cd命令进行拼写检查
- gzip 创建一个*.gz的压缩文件
$ gzip test.txt
解压*.gz文件
$ gzip -d test.txt.gz
显示压缩的比率
$ gzip -l *.gz
compressed uncompressed ratio uncompressed_name
23709 97975 75.8% asp-patch-rpms.txt
Share 一篇有观点和思考的技术文章
设计模式走起来。
公众号地址:
设计模式之模板方法模式(三)
「奔跑吧攻城狮」感谢大家的关注,现在后台回复「设计模式」赠你小编精心挑选设计模式书籍。小编想打造一个高质量交流群,回复「加群」即可解锁,也可直接微信(xuyue4087)私聊解锁。