ARTS打卡:第八周

ARTS打卡:第八周

每周完成一个ARTS:

  1. Algorithm:每周至少做一个 leetcode 的算法题
  2. Review:阅读并点评至少一篇英文技术文章
  3. Tip:学习至少一个技术技巧
  4. 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: 1

Example 2:

Input: [4,1,2,1,2]
Output: 4

题意:
给一个不空的整型数组,除一个元素之外,其余每个元素都会出现两次,找到那个独立的元素。
注意:你的算法应该具有线性运行时复杂度。你能不用额外的内存来实现它吗?

解题思路1:
根据题意,我们可以知道,输入是一个不为空的整型数组,且这个数组长度一定是奇数的,且那个不重复的元素一定是奇数位的元素,那么我们可以先对数组进行排序,然后遍历数组,假设这个数组为 nums,当 nums[i] != nums[i + 1] && nums[i] != nums[i - 1] 时,nums[i] 即为那个不重复的元素,当然首尾元素要单独进行判断。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public int singleNumber(int[] nums) {
if (nums.length == 1) {
return nums[0];
}
Arrays.sort(nums);
if (nums[0] != nums[1]) {
return nums[0];
}
for (int i = 2; i < nums.length - 1; i += 2) {
System.out.println(i);
if (i != nums.length - 1 && nums[i] != nums[i + 1] && nums[i] != nums[i - 1]) {
return nums[i];
}
}
return nums[nums.length - 1];
}

结果:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
/**
* 哇,这个解法完全没想到,打开新世界的大门
* 使用 XOR 逻辑异或 去做
* 0 ^ N = N
* N ^ N = 0
* 所以只需遍历进行异或,就能得到那个唯一的不同值
* @param nums
* @return
*/
public int singleNumber(int[] nums) {
int a = 0;
for (int i : nums) {
a ^= i;
}
return a;
}
}

结果:
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 的四点建议:

  1. 当出现问题时,要抛出异常。

  2. 尽可能使用最具体的类型。

  3. 使用 Optional 代替 nulls。

  4. 尽可能使用 “Unlift” 方法。

Tip

本周分享一个 IDEA 的插件:Sequence Diagram。
安装步骤:Setting(Ctrl + Shift + s)->Plugins->Marketplace,在插件商店直接搜索 SequenceDiagram,然后安装插件,重启 IDEA。
效果如下:

鼠标右键点击,选择 Sequence Diagram
Sequence Diagram

就可以看到自动生成的时序图了
时序图

更多详情,可以查看 SequenceDiagram 的官网:SequencePlugin

如果无法通过插件商店下载,可以在这里https://plugins.jetbrains.com/plugin/8286-sequencediagram手动下载,然后自行安装。

Share

这周分享一篇梁大的文章:《人人都是 API 设计者:我对 RESTful API、GraphQL、RPC API 的思考》