学习算法Day1(异或)

题目一

给一组整数数列, 其中只有一个数出现奇数次, 其余数出现偶数次, 求这一个数?
异或的性质

  • 0 ^ 任何数 = 任何数
  • a ^ a = 0
  • a ^ b = b ^ a
  • a ^ b ^ c = a ^ c ^ b
    public static int xor1(int[] a) {
        for (int i = 1; i < a.length; i++) {
            a[0] = a[0] ^ a[i];
        }
        return a[0];
    }

题目二

给一组整数数列, 其中有两个数出现奇数次, 其余数出现偶数次, 求这两个数?
思路
跟第一问一样的跑法只能的到 a ^ b
只要 a ^ b 不等于0, 就可以得到 至少a 和 b 有某一位不等于0
关键就是找到这一位
若 异或一轮的结果是 err, 那么这一位就是

$ err = 100100$

\(~err = 011011\)

\(~err + 1 = 011100\)

err & ~err + 1
\(result = 000100\)

    public static int[] xor2(int[] a) {
        int err = 0;
        for (int i = 0; i < a.length; i++) {
            err = err ^ a[i];
        }
        int once = err & ~err + 1;
        int right = 0;
        for (int i = 0; i < a.length; i++) {
            if((once & a[i]) == 0) right ^= a[i];
        }
        int[] w = {right, right ^ err};
        return w;
    }
posted @ 2022-03-16 12:47  信计一班王同学  阅读(24)  评论(0)    收藏  举报