zoukankan      html  css  js  c++  java
  • Leetcode 260. Single Number III

    260. Single Number III

    • Total Accepted: 42076
    • Total Submissions: 91382
    • Difficulty: Medium

    Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

    For example:

    Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].

    Note:

    1. The order of the result is not important. So in the above example, [5, 3] is also correct.
    2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?

    思路:

    a^a=0。

    nums中只有2个数是唯一,设为a,b,那么对nums所有元素异或操作以后得到的是a^b。a和b在某些位上是不相等的,所以c=a^b!=0(c是二进制数)。所以先找到a和b不相等的某一位(可以是由右向左第一个为1的位),也就是c[i]==1;再根据c[i]将nums中的元素分为2类:对c[i]贡献了1和对c[i]贡献了0,a和b被分到不同类中,再在各自类中异或操作得到a和b。

    这里注意操作符优先级:非和取反操作>加减乘除操作>==操作>与或、异或、同或操作

    代码:

     1 class Solution {
     2 public:
     3     vector<int> singleNumber(vector<int>& nums) {
     4         int Xor=0;
     5         for(int i=0;i<nums.size();i++) Xor^=nums[i];
     6         Xor&=-Xor;//取由右向左第一个为1的位
     7         vector<int> res(2,0);
     8         for(int i=0;i<nums.size();i++){
     9             //下面的if-else也可以写成res[!(Xor&diff)]^=nums[i];
    10             if((Xor&nums[i])==0){
    11                 res[0]^=nums[i];
    12             }
    13             else{
    14                 res[1]^=nums[i];
    15             }
    16         }
    17         return res;
    18     }
    19 };
  • 相关阅读:
    梦断代码,读书计划
    《梦断代码》读后感1
    四则运算2详细过程
    四则运算2初步构思
    四则运算
    阅读《梦断代码》计划
    四则运算2设计思路
    随机输出30道四则运算题
    软件工程阅读计划
    面试题04
  • 原文地址:https://www.cnblogs.com/Deribs4/p/5724588.html
Copyright © 2011-2022 走看看