zoukankan      html  css  js  c++  java
  • 剑指 Offer 56

    一、题目描述

    一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

    示例 1:

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

    输入:nums = [1,2,10,4,1,4,3,3]
    输出:[2,10] 或 [10,2]

    限制:

    2 <= nums.length <= 10000

    二、题目难度:中等

    三、题解

    方法一:

    class Solution {
    public:
        vector<int> singleNumbers(vector<int>& nums) {
            int n = nums.size();
            vector<int> res;
            int Xor = 0;
            for(int num:nums){
                Xor ^= num;
            }
            int count = 0;//Xor第count位为1
            while(!(Xor&1)){
                Xor >>= 1;
                count++;
            }
            int Xora = 0;
            int Xorb = 0;
            for(int num:nums){
                if((num>>count)&1)
                    Xora ^= num;
                else
                    Xorb ^= num;
            }
            return vector<int>{Xora, Xorb};
        }
    };

     优化代码:

    class Solution {
    public:
        vector<int> singleNumbers(vector<int>& nums) {
            int Xor = 0;
            for(int num:nums){
                Xor ^= num;
            }
            int div = 1;
            while(!(div&Xor)){
                div <<= 1;
            }
            int Xora = 0;
            int Xorb = 0;
            for(int num:nums){
                if(num&div)
                    Xora ^= num;
                else
                    Xorb ^= num;
            }
            return vector<int>{Xora, Xorb};
        }
    };

  • 相关阅读:
    机器学习之线性回归
    斯坦福机器学习【5】生成学习算法(高斯判别与朴素贝叶斯)
    网络编程
    正则表达式
    Mysql
    python爬虫
    nginx
    maven基础
    sping入门
    河北省重大技术需求征集八稿第一天
  • 原文地址:https://www.cnblogs.com/ttzz/p/14431836.html
Copyright © 2011-2022 走看看