LeetCode笔记:260. Single Number III

原创 2017年01月03日 15:40:20

问题:

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?

大意:

给出一个数字数组 nums,其中只有两个元素只出现过一次,其余的都出现了两次。找到只出现了一次的两个元素。

例子:

给出 nums = [1, 2, 1, 3, 2, 5], 返回 [3, 5].

注意:
1. 结果的顺序不重要,所以上面的例子中 [5, 3] 也是对的。
2. 你的算法应该为线性的时间复杂度。你能不能只用恒定的空间复杂度?

思路:

最简单的方法就是排序后,依次检查相邻两个数是否相等,当然遇到相等的就要跳一个数字再进行检查,遇到不相等的就记录下来是结果,注意如果单个的元素排序后在最末尾,要单独处理。

这个做法排序是需要时间和空间的,并不完全符合题目的要求。

代码(Java):

public class Solution {
    public int[] singleNumber(int[] nums) {
        Arrays.sort(nums);

        int[] result = new int[2];
        int index = 0;

        int i = 0;
        for (; i < nums.length-1; i++) {
            if (nums[i] != nums[i+1]) {
                result[index] = nums[i];
                index ++;
            }
            else i++;
        }
        if (i < nums.length) result[index] = nums[i];

        return result;
    }
}

他山之石:

public class Solution {
    public int[] singleNumber(int[] nums) {
        // Pass 1 : 
        // Get the XOR of the two numbers we need to find
        int diff = 0;
        for (int num : nums) {
            diff ^= num;
        }
        // Get its last set bit
        diff &= -diff;

        // Pass 2 :
        int[] rets = {0, 0}; // this array stores the two numbers we will return
        for (int num : nums)
        {
            if ((num & diff) == 0) // the bit is not set
            {
                rets[0] ^= num;
            }
            else // the bit is set
            {
                rets[1] ^= num;
            }
        }
        return rets;
    }
}

好的,这是一个完全符合题目要求的做法,用到了按位异或和与的操作,是什么意思呢?

首先我们要知道异或的操作是指两个数同一位上相等时结果为0,不等时结果为1。如果是两个相同的数字异或,结果自然为0,而0与一个数异或,结果也是那个数,按照我们数组的特性,遍历异或后的结果将会是两个唯一的元素的异或结果。

得到两个数的异或结果后,我们要知道,这个结果中为0的位上说明两个数字相同,为1的位上说明两个数字不同,对于这一位,将数组中所有数字和其相与,必然会得到为0和为1两个结果阵营,而我们要的两个数就在两个阵营之中,那怎么分别在两个阵营中找出两个数呢?还是上面用过的手法,遍历异或。因为相同的两个数一定会进入同一个阵营,异或后又变成0了,最后就会凸显出要找的两个数了。

上面我们说要将第一次异或后的结果中找出某一位为1的值,怎么找呢?办法很多,这里的做法是将其与自己的负数相与,就会得出一个唯一一位为1的数了。


合集:https://github.com/Cloudox/LeetCode-Record
版权所有:http://blog.csdn.net/cloudox_

版权声明:本文为博主原创文章,允许转载,注明出处,回复告诉博主一声即可。

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

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

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

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
  • 256

LeetCode Single Number III 异或+补码

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

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

LeetCode || Single Number II

Single Number II  Total Accepted: 12144 Total Submissions: 37399My Submissions Given an ...
  • jiadebin890724
  • jiadebin890724
  • 2014年04月09日 23:35
  • 18956

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

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 numbers nums, in which exactly two elements appear only once and all the ot...
  • cfylove
  • cfylove
  • 2016年05月24日 16:23
  • 116

LeetCode - 260. Single Number III

在Single Number的基础上,只出现一次的数字从一个变成了两个,同样地我们仍然希望使用xor的技巧来方便地得到两个只出现一次的数字,所以我们需要思考一种方法将给出的数字分为两堆,每堆含有的除了...
  • shenzhu0127
  • shenzhu0127
  • 2016年06月30日 08:38
  • 191
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode笔记:260. Single Number III
举报原因:
原因补充:

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