Skip to content

Commit 0ace7e4

Browse files
authored
feat: update solution to lc problem: No.0645 (doocs#1230)
1 parent 013e167 commit 0ace7e4

File tree

1 file changed

+7
-3
lines changed
  • solution/0600-0699/0645.Set Mismatch

1 file changed

+7
-3
lines changed

solution/0600-0699/0645.Set Mismatch/README.md

+7-3
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,15 @@
4343

4444
异或运算求解。
4545

46-
首先明确,两个相同的数异或之后的结果为 0。对该数组所有元素以及 `i∈[1, n]` 所有数字进行异或运算,结果就是**两个只出现一次的数字异或的结果**,即 `eor = a ^ b`
46+
首先明确,两个相同的数异或之后的结果为 0。对该数组所有元素以及 `i∈[1, n]` 所有数字进行异或运算,这样可以消除出现两次的数字,只留下缺失的数字和重复的数字,即 `eor = a ^ b`
4747

48-
找出这个结果 eor 中最后一个二进制位为 1 而其余位为 0 的数,即 `eor & (~eor + 1)`,之后遍历数组所有元素以及 `i∈[1, n]` 所有数字,二进制位为 0 的元素异或到 a。
48+
使用按位与运算符 `&` 和取反运算符 `~`,从异或结果 eor 中找到最右边的`置位位`(在二进制表示中从右向左数的第一个为1的位)用来区分缺失数字和重复数字的位置,即 `eor & (~eor + 1)`
4949

50-
遍历结束后 `b = eor ^ a`,返回结果即可。
50+
之后遍历数组所有元素以及 `i∈[1, n]` 所有数字,根据`置位位`将数字分为两组,一组是在置位位上为 0 的数字,另一组是在置位位上为 1 的数字, 二进制位为 0 的元素异或到 `a`,即缺失的数字。
51+
52+
遍历结束后 `b = eor ^ a``b`即重复的数字,返回结果即可。
53+
54+
时间复杂度 $O(n)$, 位运算解法空间复杂度 $O(1)$。
5155

5256
<!-- tabs:start -->
5357

0 commit comments

Comments
 (0)