zoukankan      html  css  js  c++  java
  • [每日一题] 剑指 Offer 56

    一个整型数组 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;
    
        }
    };
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    20209/29
    2020/9/30
    2020/10/1
    ATM测试总结报告
    20201020 千锤百炼软工人
    20201024 千锤百炼软工人
    20201025 千锤百炼软工人
    20201023 千锤百炼软工人
    20201018 千锤百炼软工人
    20201022 千锤百炼软工人
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/14732141.html
Copyright © 2011-2022 走看看