[每日一题] 剑指 Offer 56 - I. 数组中数字出现的次数

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。

请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

关键是O(1)的空间复杂度

先对所有的值异或一下求得ans

则相同的两个数就会消去,又因为有两个不同的,因此ans的二进制必有一位为1

可以求出从右向左第一个为1的位,然后据此将所有的数分成两组,分别异或

则最终两组的异或结果 即为求得结果

class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
        vector<int> v;
        int ans = 0, ans1 = 0, ans2 = 0;
        int n = nums.size();
        for(int i = 0; i < n; i++)
            ans ^= nums[i];
        int index = 1;
        while(ans)
        {
            if(ans & 1 == 1) break;
            ans >>= 1;
            index++;
        }
        for(int i = 0; i < n; i++)
            if(((nums[i] >> (index - 1)) & 1) == 1) ans1 ^= nums[i];
            else ans2 ^= nums[i];
        v.push_back(ans1);
        v.push_back(ans2);
        return v;

    }
};

 

上一篇:测试面试题集-Python列表去重


下一篇:函数测试数据