mirror of https://github.com/doocs/leetcode.git
feat: update leetcode and lcof solutions
This commit is contained in:
parent
6d261ee876
commit
257cd291e5
|
|
@ -26,7 +26,11 @@
|
|||
|
||||
异或运算求解。
|
||||
|
||||
首先明确,两个相同的数异或之后的结果为 0。对该数组所有元素进行异或运算,结果就是**两个只出现一次的数字异或的结果**。找出这个结果中某个二进制位为 1 的位置,之后对数组所有元素进行分类,二进制位为 0 的异或到 a,二进制位为 1 的异或到 b,结果就是 a,b。
|
||||
首先明确,两个相同的数异或之后的结果为 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];
|
||||
};
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
}
|
||||
}
|
||||
|
|
@ -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];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
@ -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};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
}
|
||||
}
|
||||
|
|
@ -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]
|
||||
|
|
|
|||
Loading…
Reference in New Issue