XOR


规则

0 ^ 0 = 1 ^ 1 = 0

1 ^ 0 = 0 ^ 1 = 1

a ^ a = 0


Single Number

找数组里只有出现一次的那个数,别的数都出现两次

public class Solution {
    public int singleNumber(int[] nums) {
        int n = 0;
        for (int num: nums) {
            n ^= num;
        }
        return n;
    }
}

Find the Difference

找唯一insert的那个character

public class Solution {
    public char findTheDifference(String s, String t) {
        char c = 0;
        for (int i = 0; i < s.length(); i++) {
            c ^= s.charAt(i);
            c ^= t.charAt(i);
        }
        c ^= t.charAt(t.length() - 1);
        return c;
    }
}

Missing Number

找唯一missing的那个数字,拿数值和index做xor

public class Solution {
    public int missingNumber(int[] nums) {
        int result = 0;
        for (int i = 0; i < nums.length; i++) {
            result ^= i;
            result ^= nums[i];
        }
        result ^= nums.length;
        return result;
    }
}

Single Number III

有两个唯一出现一次的数字,剩下的其他数字都出现两次。

按Single Number I里方法做xor以后,我们得到的结果实际就是那两个single number做了xor后的结果。

那这个数的各个digit上,数字为1的digit可以被用来区分这两个数。

int lastOneBit = xor & -xor。这个lastOneBit来到的结果就是从最低位看过来第一个出现了1的那个数值。拿这个lastOneBit对整个数组分类既可以得到我们想要的两个数。

public class Solution {
    public int[] singleNumber(int[] nums) {
        int xor = 0;
        for (int num: nums) {
            xor ^= num;
        }

        int lastOneBit = xor & -xor;
        int num1 = 0, num2 = 0;
        for (int num: nums) {
            if ((num & lastOneBit) == 0) {
                num1 ^= num;
            } else {
                num2 ^= num;
            }
        }

        return new int[]{num1, num2};
    }
}

results matching ""

    No results matching ""