zoukankan      html  css  js  c++  java
  • 在整形数组中找到只出现一次的两个整数

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

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

    输入:nums = [4,1,4,6]
    输出:[1,6] 或 [6,1]

    代码:

    #include<iostream>
    #include<vector>
    using namespace std;
    class Solution {
    public:
        vector<int> singleNumbers(vector<int>& nums) {
            int a=0,b=0,c=0,d=1;
            for(int i=0;i<nums.size();i++)//通过异或找到只出现一次的两个整数的异或结果 
            {
                a^=nums[i];
            }
            while((a&d)==0)//两个不同数字至少有一个二进制位不同,而那个二进制位的
            {              //异或结果为1,所以找到那个二进制位为1,其余为0的整数 
                d<<=1;    // 
            }
            for(int i=0;i<nums.size();i++)
            {
                if((nums[i]&d)==0)//以该二进制位将原数组分为两组,最后异或的结果也就是原来的两个整数了 
                {
                    b^=nums[i];
                }
                else
                {
                    c^=nums[i];
                }
            }
            vector<int> v;
            v.push_back(b);
            v.push_back(c);
            return v;
        }
    };

    类似的,比如

    定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗?

    以任意顺序返回这两个数字均可。

    输入: [2,3]
    输出: [1,4]

    都是稍微变化了一些,还是通过异或就可以解决了。

  • 相关阅读:
    160809322-王翔君第十一次c语言作业
    c语言第九次作业
    王翔君第9次c语言作业
    王翔君160809322第六次作业
    160809322-王翔君第四次作业
    第三次作业160809322
    160809322-王翔君
    160809322-王翔君
    输出不可重复的质因数
    求最大数与最小数乘积
  • 原文地址:https://www.cnblogs.com/dayq/p/15647310.html
Copyright © 2011-2022 走看看