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_

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

Leetcode260 Single Number III

leetcode260

leetcode 260.Single Number III

在leetcode的第260题 Single Number III 中有位大神的解题方法。

LeetCode(260) Single Number III

题目Given an array of numbers nums, in which exactly two elements appear only once and all the other e...
  • fly_yr
  • fly_yr
  • 2015年12月02日 14:41
  • 1065

LeetCode oj 260. Single Number III (位运算)

260. Single Number III   Question Editorial Solution  My Submissions Total Ac...
  • Sara_YF
  • Sara_YF
  • 2016年10月05日 20:17
  • 191

[leetcode] 260.Single Number III

题目: Given an array of numbers nums, in which exactly two elements appear only once and all the othe...

LeetCode 260. Single Number III 题解(C++)

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

LeetCode 260. Single Number III 解题报告

LeetCode 260. Single Number III 解题报告

leetcode 260. Single Number III --> 用hashmap计算出现的次数,注意containsKey获取key,用 get 方法获取值

260. Single Number III   Question Editorial Solution  My Submissions Total Accepted: 42681T...

【leetcode】260. Single Number III

一、题目描述 Given an array of numbers nums, in which exactly two elements appear only once and all the...

LeetCode - 260. Single Number III

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

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