260. Single Number III

原创 2016年05月31日 19:17:40

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?

1.我的答案 

当然是最直接的啦,用一个哈希表存储,最后来遍历一遍

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        map<int,int> mp;
        vector<int> res;
        int len = nums.size();
        for(int i = 0; i < len; i++){
            if(mp.find(nums[i]) == mp.end()){
                mp[nums[i]] = 1;
            }
            else
                mp[nums[i]]++;
        }
        for(auto iter = mp.begin(); iter != mp.end(); iter++){
            if(iter->second == 1)
            res.push_back(iter->first);
        }
        return res;
    }
};

2.看了别人答案做的

思路:先把所有的值都异或一遍,相同的值异或异或肯定是0,则剩下的值就是单个出现的这两个数的异或结果。此时找该数的最右边(最左边也一样)第一次出现的1 的位置(该位置对应的那两个数一定是0和1),用此位置将该数组分为两部分。一部分是此位置为1的数,另一部分是此位置为0的数。同时这两边数各自含有一个唯一出现一次的数,其余都是出现两次的数。然后找出这个只出现一次的数即可。

这里有个小技巧:

要得到最右边第一次出现1的位置为1的数,可用以下方法:

int bit = a & ~(a-1);

bit即可得到a中右边第一次出现1的数。

例如: a = 110, 则bit = 110 & 010 = 010

以下是代码部分:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int temp = 0;
        for(int i = 0; i < nums.size(); i++){
            temp ^= nums[i];
        }
        int xors = temp & ~(temp - 1);
        int num1 = 0, num2 = 0;
        for(int j = 0; j < nums.size(); j++){
            if((nums[j] & xors) > 0)
                num1 ^= nums[j];
            else
                num2 ^= nums[j];
        }
        vector<int> res;
        res.push_back(num1);
        res.push_back(num2);
        return res;
    }
};


Middle-题目2:260. Single Number III

题目原文: Given an array of numbers nums, in which exactly two elements appear only once and all the ot...
  • cmershen
  • cmershen
  • 2016年05月31日 15:23
  • 258

[leetcode] 260.Single Number III

题目: Given an array of numbers nums, in which exactly two elements appear only once and all the othe...
  • u014673347
  • u014673347
  • 2015年08月17日 17:42
  • 1335

LeetCode 260 Single Number III(只出现一次的数字 III)(*)

原文给定一个数字数组nums,其中有两个元素只出现一次,而其他所有元素均出现两次。找出这两个只出现一次的元素。例如:给定nums = [1, 2, 1, 3, 2, 5],返回[3, 5]。备注: 1...
  • NoMasp
  • NoMasp
  • 2016年02月18日 15:06
  • 4545

.260. Single Number III

class Solution { public: vector singleNumber(vector& nums) { int result=0; for(a...
  • ZeroCBoy
  • ZeroCBoy
  • 2016年08月30日 16:01
  • 102

260. Single Number III

Given an array of numbers nums, in which exactly two elements appear only once and all the other e...
  • u011785661
  • u011785661
  • 2016年02月23日 19:04
  • 53

[LeetCode 260] Single Number III

Given an array of numbers nums, in which exactly two elements appear only once and all the other ele...
  • sbitswc
  • sbitswc
  • 2015年09月13日 04:22
  • 9321

LeetCode Single Number III 异或+补码

思路:给定数组中只有2个数是出现1次(设为a和b),其余的数都是出现2次,找出这两个出线1次的数。遍历一遍,将所有数字异或XOR 起来,结果设为 diff ,出现2次的数可以通过异或消去,留下的那2个...
  • yeruby
  • yeruby
  • 2015年11月15日 22:23
  • 1784

LeetCode 260. Single Number III

Given an array of Numbers nums, in which exactly two elements appear only once and  all other elemen...
  • github_34333284
  • github_34333284
  • 2016年03月29日 04:01
  • 109

[LeetCode] 260. Single Number III

题目: Given an array of integers, every element appears three times except for one. Find that sin...
  • sakurairo_maukoro
  • sakurairo_maukoro
  • 2016年08月27日 19:34
  • 251

260.[LeetCode]Single Number III

简直是药开动大脑,如果理解上一道类型题为什么要用异或,那么这一道题也是很好理解的// 明确只有两个是唯一的,其他都是成对的 // 返回的数组不要求顺序 // 线性时间,常量空间 public clas...
  • qq_28057541
  • qq_28057541
  • 2016年08月26日 21:43
  • 240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:260. Single Number III
举报原因:
原因补充:

(最多只允许输入30个字)