上周因为版本的改版,投入了比较多的时间,又恰逢中秋,结果就把打卡给鸽了,实在有点对不住大家。
但是有朋友鼓励我,还是在等待着我的更新,所以,这周我又回来了。坚持一种习惯,不能偷懒,不然,哪天开始,你都不知道自己还曾拥有过这么好的习惯。
一起写作课的同学,有的上了头条的青云奖,有的公众号阅读量已经很高,而我还在原地踏步中,向我优秀的同学看齐,还需要多多努力。
不要问ARTS为什么能让我坚持这么久,看完每一期的打卡,你就懂了。现在已经不需要更多言语表达了,直接开干!这是第二十五期打卡。
只出现一次的数字
(https://leetcode-cn.com/problems/single-number/
)
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。你可以不使用额外空间来实现吗?
示例1:
输入: [2,2,1]
输出: 1
示例2:
输入: [4,1,2,1,2]
输出: 4
拿到这个题目,其实之前也做过几个类似的,判断是否有重复的。那第一反应就是用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;
}
除了这两种解法,其实还有暴力循环,快速排序或者更多的方式,在这里就不一一说明了,读者们可以自行去查找。
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 教科书。
文中出现的金句很多,我在这里分享部分给大家:
3 Principles for Good Software Development
所以,这篇文章也让我看到了新加坡那边的编码要求以及一些习惯,看上去,其实都是大同小异。比如提到尽可能的去实践,找出并迭代问题,降低复杂度,扩展程序。这些能力,无论你在哪,哪怕是天涯海角,都是每个程序员必备的技能。
前面两期,都介绍了Linux常用命令的其中5种,我每次都给出5个,也让大家好消化一点,毕竟这个只有实际操作过才知道。
今天介绍11-15.
$ 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 -lh
-rw-r----- 1 ramesh team-dev 8.9M Jun 12 15:27 arch-linux.txt.gz
以最后修改时间升序列出文件
$ ls -ltr
在文件名后面显示文件类型
$ ls -F
使用shopt -s cdspell可以设置自动对cd命令进行拼写检查
$ 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
设计模式走起来。
公众号地址: 设计模式之模板方法模式(三)