feat: update leetcode and lcof solutions

This commit is contained in:
yanglbme 2021-03-21 21:43:16 +08:00
parent 6d261ee876
commit 257cd291e5
8 changed files with 94 additions and 115 deletions

View File

@ -26,7 +26,11 @@
异或运算求解。
首先明确,两个相同的数异或之后的结果为 0。对该数组所有元素进行异或运算结果就是**两个只出现一次的数字异或的结果**。找出这个结果中某个二进制位为 1 的位置,之后对数组所有元素进行分类,二进制位为 0 的异或到 a二进制位为 1 的异或到 b结果就是 ab。
首先明确,两个相同的数异或之后的结果为 0。对该数组所有元素进行异或运算结果就是**两个只出现一次的数字异或的结果**,即 `eor = a ^ b`
找出这个结果 eor 中最后一个二进制位为 1 而其余位为 0 的数,即 `eor & (~eor + 1)`,之后遍历数组所有元素,二进制位为 0 的元素异或到 a。
遍历结束后 `b = eor ^ a`,返回结果即可。
<!-- tabs:start -->
@ -35,21 +39,16 @@
```python
class Solution:
def singleNumbers(self, nums: List[int]) -> List[int]:
xor_res = 0
eor = 0
for num in nums:
xor_res ^= num
pos = 0
while (xor_res & 1) == 0:
pos += 1
xor_res >>= 1
a = b = 0
eor ^= num
# 找出最右边的 1
diff = eor & (~eor + 1)
a = 0
for num in nums:
t = num >> pos
if (t & 1) == 0:
if (num & diff) == 0:
a ^= num
else:
b ^= num
b = eor ^ a
return [a, b]
```
@ -58,25 +57,20 @@ class Solution:
```java
class Solution {
public int[] singleNumbers(int[] nums) {
int xor = 0;
int eor = 0;
for (int num : nums) {
xor ^= num;
eor ^= num;
}
int pos = 0;
while ((xor & 1) == 0) {
++pos;
xor >>= 1;
}
int a = 0, b = 0;
// # 找出最右边的 1
int diff = eor & (~eor + 1);
int a = 0;
for (int num : nums) {
int t = num >> pos;
if ((t & 1) == 0) {
if ((num & diff) == 0) {
a ^= num;
} else {
b ^= num;
}
}
return new int[] {a, b};
int b = eor ^ a;
return new int[]{a, b};
}
}
```
@ -89,24 +83,19 @@ class Solution {
* @return {number[]}
*/
var singleNumbers = function (nums) {
let xor = 0;
let bit = 1;
let res = [0, 0];
let eor = 0;
for (let num of nums) {
xor ^= num;
}
while ((xor & 1) === 0) {
xor >>= 1;
bit <<= 1;
eor ^= num;
}
const diff = eor & (~eor + 1);
let a = 0;
for (let num of nums) {
if ((num & bit) === 0) {
res[0] ^= num;
} else {
res[1] ^= num;
if ((num & diff) == 0) {
a ^= num;
}
}
return res;
let b = eor ^ a;
return [a, b];
};
```

View File

@ -1,23 +1,18 @@
class Solution {
public int[] singleNumbers(int[] nums) {
int xor = 0;
int eor = 0;
for (int num : nums) {
xor ^= num;
eor ^= num;
}
int pos = 0;
while ((xor & 1) == 0) {
++pos;
xor >>= 1;
}
int a = 0, b = 0;
// # 找出最右边的 1
int diff = eor & (~eor + 1);
int a = 0;
for (int num : nums) {
int t = num >> pos;
if ((t & 1) == 0) {
if ((num & diff) == 0) {
a ^= num;
} else {
b ^= num;
}
}
return new int[] { a, b };
int b = eor ^ a;
return new int[]{a, b};
}
}

View File

@ -3,22 +3,17 @@
* @return {number[]}
*/
var singleNumbers = function (nums) {
let xor = 0;
let bit = 1;
let res = [0, 0];
let eor = 0;
for (let num of nums) {
xor ^= num;
}
while ((xor & 1) === 0) {
xor >>= 1;
bit <<= 1;
eor ^= num;
}
const diff = eor & (~eor + 1);
let a = 0;
for (let num of nums) {
if ((num & bit) === 0) {
res[0] ^= num;
} else {
res[1] ^= num;
if ((num & diff) == 0) {
a ^= num;
}
}
return res;
let b = eor ^ a;
return [a, b];
};

View File

@ -1,18 +1,13 @@
class Solution:
def singleNumbers(self, nums: List[int]) -> List[int]:
xor_res = 0
eor = 0
for num in nums:
xor_res ^= num
pos = 0
while (xor_res & 1) == 0:
pos += 1
xor_res >>= 1
a = b = 0
eor ^= num
# 找出最右边的 1
diff = eor & (~eor + 1)
a = 0
for num in nums:
t = num >> pos
if (t & 1) == 0:
if (num & diff) == 0:
a ^= num
else:
b ^= num
b = eor ^ a
return [a, b]

View File

@ -32,17 +32,16 @@
```python
class Solution:
def singleNumber(self, nums: List[int]) -> List[int]:
xor = 0
eor = 0
for num in nums:
xor ^= num
# x & (-x) 是保留位中最右边 1 ,且将其余的 1 设位 0 的方法
diff = xor & (-xor)
a = b = 0
eor ^= num
# 提取最右边的 1
diff = eor & (~eor + 1)
a = 0
for num in nums:
if (num & diff) == 0:
a ^= num
else:
b ^= num
b = eor ^ a
return [a, b]
```
@ -53,16 +52,19 @@ class Solution:
```java
class Solution {
public int[] singleNumber(int[] nums) {
int xor = 0;
int eor = 0;
for (int num : nums) {
xor ^= num;
eor ^= num;
}
int diff = xor & (-xor);
int a = 0, b = 0;
// 提取最右的 1
int diff = eor & (~eor + 1);
int a = 0;
for (int num : nums) {
if ((num & diff) == 0) a ^= num;
else b ^= num;
if ((num & diff) == 0) {
a ^= num;
}
}
int b = eor ^ a;
return new int[]{a, b};
}
}

View File

@ -30,18 +30,16 @@
```python
class Solution:
def singleNumber(self, nums: List[int]) -> List[int]:
xor = 0
eor = 0
for num in nums:
xor ^= num
diff = xor & (-xor)
a = b = 0
eor ^= num
diff = eor & (~eor + 1)
a = 0
for num in nums:
if (num & diff) == 0:
a ^= num
else:
b ^= num
b = eor ^ a
return [a, b]
```
### **Java**
@ -49,16 +47,18 @@ class Solution:
```java
class Solution {
public int[] singleNumber(int[] nums) {
int xor = 0;
int eor = 0;
for (int num : nums) {
xor ^= num;
eor ^= num;
}
int diff = xor & (-xor);
int a = 0, b = 0;
int diff = eor & (~eor + 1);
int a = 0;
for (int num : nums) {
if ((num & diff) == 0) a ^= num;
else b ^= num;
if ((num & diff) == 0) {
a ^= num;
}
}
int b = eor ^ a;
return new int[]{a, b};
}
}

View File

@ -1,15 +1,18 @@
class Solution {
public int[] singleNumber(int[] nums) {
int xor = 0;
int eor = 0;
for (int num : nums) {
xor ^= num;
eor ^= num;
}
int diff = xor & (-xor);
int a = 0, b = 0;
// 提取最右的 1
int diff = eor & (~eor + 1);
int a = 0;
for (int num : nums) {
if ((num & diff) == 0) a ^= num;
else b ^= num;
if ((num & diff) == 0) {
a ^= num;
}
}
int b = eor ^ a;
return new int[]{a, b};
}
}

View File

@ -1,13 +1,13 @@
class Solution:
def singleNumber(self, nums: List[int]) -> List[int]:
xor = 0
eor = 0
for num in nums:
xor ^= num
diff = xor & (-xor)
a = b = 0
eor ^= num
# 提取最右边的 1
diff = eor & (~eor + 1)
a = 0
for num in nums:
if (num & diff) == 0:
a ^= num
else:
b ^= num
b = eor ^ a
return [a, b]