自学内容网 自学内容网

260. 只出现一次的数字 III

260. 只出现一次的数字 III
题目含义:有一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次,我们需要返回只出现一次的两个元素。

根据部分元素出现两次的情况,我们可以用异或运算 ⊕ \oplus ,它的运算规则是在二进制表示,在同一位的数若是不同则为 1,否则为 0;还有以下两个性质:

  1. a ⊕ b ⊕ b = a a \oplus b \oplus b = a abb=a
  2. a ⊕ 0 = a a \oplus 0 = a a0=a

根据上面对 ⊕ \oplus 的解释,我们对数组的所有元素进行异或计算,得到 z = x ⊕ y z = x \oplus y z=xy,其中 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)!