剑指 Offer 56 - I. 数组中数字出现的次数

题目链接:

【分析】如果改成只有一个数字出现一次,其余都出现两次,那么就可以直接异或,最后的结果就是那个出现一次的数字,但是现在是两个出现一次的,这样的话异或的结果就是a^b,其中a和b至少有一位不同,这就意味着最后的结果中必定有一位是1;

接下来我们就可以根据这个1来进行划分,a或b中有一个&这一位的结果为1另一个为0,那么如何找到这个位呢,可以循环&1或者使用lowbit

class Solution {
    public int[] singleNumbers(int[] nums) {
        int pre = 0;
        for(var i: nums) pre ^= i;
        int p = 1;
        while((p & pre) == 0) p <<= 1;
        int[] ans = new int[2];
        int a1 = 0, a2 = 0;
        for(var i: nums){
            if((i & p) == 0) a1 ^= i;
            else a2 ^= i;
        }
        ans[0] = a1; ans[1] = a2;
        return ans;
    }
}
class Solution {
    public int[] singleNumbers(int[] nums) {
        int pre = 0;
        for(var i: nums) pre ^= i;
        int p = pre & -pre;
        int[] ans = new int[2];
        int a1 = 0, a2 = 0;
        for(var i: nums){
            if((i & p) == 0) a1 ^= i;
            else a2 ^= i;
        }
        ans[0] = a1; ans[1] = a2;
        return ans;
    }
}
经验分享 程序员 微信小程序 职场和发展