题解 | #数组中只出现一次的两个数字#

数组中只出现一次的两个数字

https://www.nowcoder.com/practice/389fc1c3d3be4479a154f63f495abff8

import java.util.*;


public class Solution {

    public int[] FindNumsAppearOnce (int[] nums) {
        /*
            step 1:遍历整个数组,将每个元素逐个异或运算,得到 a^b
            step 2:我们可以考虑位运算的性质,找到二进制中第一个不相同的位,将所有数组划分成两组
            step 3:遍历数组对分开的数组单独作异或连算
            step 4:最后整理次序输出
        */  

        int xor = 0;
        for(int x : nums) {
            xor ^= x;
        }
        int mask = 1; // 第一个不同的二进制位
        while((mask & xor) == 0) {
            mask <<= 1;
        }

        int a = 0, b = 0;
        for(int x : nums) {
            if((x & mask) == 0) {
                a ^= x;
            } else {
                b ^= x;
            }
        }

        if(a > b) {
            a ^= b;
            b ^= a;
            a ^= b;
        }
        return new int[] {a, b};
    }

}

全部评论

相关推荐

投递字节跳动等公司10个岗位
点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务