zoukankan      html  css  js  c++  java
  • 56.数组中数字出现的次数 II

    欢迎来访

    56.数组中数字出现的次数 II

    异或运算法则:

    • x ^ y = y ^ x,交换律
    • (x ^ y) ^ z = x ^ (y ^ z),结合律
    • x ^ x = 0
    • x ^ 0 = x
    • x ^ y ^ x = y

    如果数组中有一个数是出现一次,其余的数出现两次,让我们找到这一个数,可以将所有的数异或一遍,记为sum,则最后的结果就是我们要找的数,其他的数在异或的过程中变为0

    在本题中,将所有的数异或一遍得到的sum=x^y,(x y是要找的两个数),x^y一定不为零,因为xy不相等,这就意味着xy的某一位k必然不相等,一个为1一个为0,因此我们可以按照第k位的数值将数组中所有的元素分为两类。我们不妨设x的第k位为1y的第k位为0,将所有第k位为1的数异或一遍最终的答案就是x,将所有第k位为0的数异或一遍最终的答案就是y,当然y可以直接用sum^x求出。

    C++代码

    class Solution {
    public:
        vector<int> singleNumbers(vector<int>& nums) {
            int sum = 0;
            for (auto num : nums) {
                sum ^= num;
            }
            int k = 0;
            while (!(sum >> k & 1)) k++;
            int x = 0;
            for (auto num : nums) {
                if (num >> k & 1) {
                    x ^= num;
                }
            }
            return vector<int>{x, sum ^ x};
        }
    };
    

    Java代码

    class Solution {
        public int[] singleNumbers(int[] nums) {
            int sum = 0;
            for (int num : nums) {
                sum ^= num;
            }
            int k = 0;
            while ((sum >> k & 1) != 1) k++;
            int x = 0;
            for (int num : nums) {
                if ((num >> k & 1) == 1) {
                    x ^= num;
                }
            }
            return new int[]{x, sum ^ x};
        }
    }
    

    参考

    AcWing

  • 相关阅读:
    POJ 2251 Dungeon Master
    HDU 3085 Nightmare Ⅱ
    CodeForces 1060 B Maximum Sum of Digits
    HDU 1166 敌兵布阵(树状数组)
    HDOJ 2050 折线分割平面
    HDU 5879 Cure
    HDU 1878 欧拉回路
    HDU 6225 Little Boxes
    ZOJ 2971 Give Me the Number
    HDU 2680 Choose the best route
  • 原文地址:https://www.cnblogs.com/optimjie/p/12791494.html
Copyright © 2011-2022 走看看