ARTS打卡:第八周
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
Algorithm
136. Single Number(Easy)
Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1]
Output: 1Example 2:
Input: [4,1,2,1,2]
Output: 4
题意:
给一个不空的整型数组,除一个元素之外,其余每个元素都会出现两次,找到那个独立的元素。
注意:你的算法应该具有线性运行时复杂度。你能不用额外的内存来实现它吗?
解题思路1:
根据题意,我们可以知道,输入是一个不为空的整型数组,且这个数组长度一定是奇数的,且那个不重复的元素一定是奇数位的元素,那么我们可以先对数组进行排序,然后遍历数组,假设这个数组为 nums,当 nums[i] != nums[i + 1] && nums[i] != nums[i - 1] 时,nums[i] 即为那个不重复的元素,当然首尾元素要单独进行判断。
代码如下:
1 | public int singleNumber(int[] nums) { |
结果:
Runtime: 3 ms, faster than 42.26% of Java online submissions for Single Number.
Memory Usage: 37.9 MB, less than 77.61% of Java online submissions for Single Number.
解题思路2:
还有一种解算,我在讨论区看到的,着实让我眼前一亮,从而打开了新世界的大门。
利用 XOR 逻辑异或去做,因为 0 ^ N = N,N ^ N = 0,所以只需以0为初始值,去遍历数组,进行异或运算,最后就能得到那个唯一的不同值。
代码如下:
1 | class Solution { |
结果:
Runtime: 0 ms, faster than 100.00% of Java online submissions for Single Number.
Memory Usage: 38.2 MB, less than 73.27% of Java online submissions for Single Number.
时间复杂度:O(n)
空间复杂度:O(1)
Review
本周分享一篇在 Medium 上看到的文章:《What I learned from doing 1000 code reviews》。
作者在这篇文章中,分享了自己在 LinkedIn 工作期间,进行大量代码审查后得出 code review
的四点建议:
当出现问题时,要抛出异常。
尽可能使用最具体的类型。
使用 Optional 代替 nulls。
尽可能使用 “Unlift” 方法。
Tip
本周分享一个 IDEA 的插件:Sequence Diagram。
安装步骤:Setting(Ctrl + Shift + s)->Plugins->Marketplace,在插件商店直接搜索 SequenceDiagram,然后安装插件,重启 IDEA。
效果如下:
鼠标右键点击,选择 Sequence Diagram
就可以看到自动生成的时序图了
更多详情,可以查看 SequenceDiagram 的官网:SequencePlugin。
如果无法通过插件商店下载,可以在这里https://plugins.jetbrains.com/plugin/8286-sequencediagram手动下载,然后自行安装。
Share
这周分享一篇梁大的文章:《人人都是 API 设计者:我对 RESTful API、GraphQL、RPC API 的思考》