Middle-题目2:260. Single Number III

原创 2016年05月31日 15:23:50

题目原文:
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.
题目大意:
给一个数组,里面有两个元素只出现了一次,而其他数都出现了两次,找出这两个元素。
题目分析:
这道题是Middle-题目1的变形。
朴素解法:
用HashSet存储每一个元素,如果元素存在于集合内就remove掉,否则add进集合内,这样遍历完一个数组就set里面只剩下两个元素。
使用位运算的解法:
设两个单独的数是a和b,先把所有数都异或起来,得到a⊕b,记这个数是r,而因为a≠b,所以r≠0,r对应的二进制数一定有1。再令mask=r∧¬(r-1),得到一个比特串,mask串一定只有一位是1,其他位都是0,这个1即是r中最低位的1.既然这一位为1,说明a和b中对应位必然一个是0一个是1。再遍历一遍这个数组,把每个数和mask求一次与,再分别异或起来,这就得到了a和b。(因为相当于分成mask所在位为0和1的两个子数组,把这两个子数组都异或起来自然得到了a和b。)
源码:(language:java)
朴素解法:

public class Solution {
    public int[] singleNumber(int[] nums) {
        HashSet<Integer> set=new HashSet<Integer>();
        for(int num:nums) {
            if(set.contains(num))
                set.remove(num);
            else
                set.add(num);               
        }
        int[] array=new int[2];
        int i=0;
        for(int num:set)
            array[i++]=num;

        return array;


    }
}

位运算解法:

public class Solution {
    public int[] singleNumber(int[] nums) {
        int[] res = new int[2];
        int r = 0;
        for(int i=0;i<nums.length;i++) {
            r = r^nums[i];
        }
        res[0] = 0;
        res[1] = 0;
        int mask = r & (~(r-1));
        for(int i=0;i<nums.length;i++){
            if((mask & nums[i])!=0){
                res[0] = res[0] ^ nums[i];
            }else {
                res[1] = res[1] ^ nums[i];
            }
        }
        return res;
    }
}

成绩:
朴素解法:12ms,beats 14.33%,众数2ms,62.30%
位运算解法:2ms,beats 37.32%

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

toj-3515-middle number(优先队列)

There is a sequence of integers, we have two operations now 1 add a: means add an integer a to the ...
  • Accept1234
  • Accept1234
  • 2017年04月30日 13:17
  • 329

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

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

[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

.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 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 the other ele...
  • sbitswc
  • sbitswc
  • 2015年09月13日 04:22
  • 9321

[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
  • 246

[LeetCode]260. Single Number III

Given an array of numbers nums, in which exactly two elements appear only once and all the other e...
  • Winter_ann
  • Winter_ann
  • 2016年03月04日 10:28
  • 76

Leetcode 260. Single Number III

Single Number III Given an array of numbers nums, in which exactly two elements appear only once a...
  • Hanwenwangad
  • Hanwenwangad
  • 2016年01月22日 04:08
  • 178
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目2:260. Single Number III
举报原因:
原因补充:

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