260. 只出现一次的数字 III
260. 只出现一次的数字 III
题目含义:有一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次,我们需要返回只出现一次的两个元素。
根据部分元素出现两次的情况,我们可以用异或运算 ⊕ \oplus ⊕,它的运算规则是在二进制表示,在同一位的数若是不同则为 1,否则为 0;还有以下两个性质:
- a ⊕ b ⊕ b = a a \oplus b \oplus b = a a⊕b⊕b=a;
- a ⊕ 0 = a a \oplus 0 = a a⊕0=a。
根据上面对
⊕
\oplus
⊕ 的解释,我们对数组的所有元素进行异或计算,得到
z
=
x
⊕
y
z = x \oplus y
z=x⊕y,其中
x
x
x 和
y
y
y 是 nums 数组中只出现一次的元素。然后我们取
z
z
z 最低位的那个 1,设其为第
l
l
l 位,那么
x
x
x 和
y
y
y 中其中一个数在第
l
l
l 位为 0,另一个数在这个位为 1。
这样就可以把 nums 中的所有元素分为两类,再次遍历数组:其中一类是元素与第
l
l
l 位进行按位与操作,其结果为 1,表示为 type1;另一类就是结果为 0,表示为 type2;并且在遍历过程中对同一类对元素进行异或操作,根据上面的 2 个性质,最后的 type1 和 type2 就是
x
x
x 和
y
y
y。
/**
* @param {number[]} nums
* @return {number[]}
*/
var singleNumber = function(nums) {
let ss = 0;
for (n of nums) ss ^= n;
const lowbit = ss & (-ss);
let type1 = 0, type2 = 0;
for (n of nums) {
if (n & lowbit) type1 ^= n;
else type2 ^= n;
}
return [type1, type2];
};
原文地址:https://blog.csdn.net/I_am_toutu/article/details/142891214
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!