zoukankan      html  css  js  c++  java
  • [LeetCode] 260. Single Number III Java

    题目: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].

    题意及分析:给出一个数组,其中里面有两个数只出现一次,其他的均出现两次。找出这两个数。这道题主要和single1类似,但是这里有两个不同的数,所以需要从这两个数的异或值反推得到结果。整数的二进制在java中是补码表示,所以我们可以用n&-n得到n的二进制最右边的一个1。这样对于这个为1的位置,肯定可以分辨出这两个数,因为一定有两个数在这个位置1个为1,另一个为0。所以遍历整个数组,和这个数做&操作,就可以将两个数分开到两组中。因为其他出现两次的数,异或操作还是为0,对结果没有影响,所以对每个遍历到的数做异或操作即可。讲得不是很清楚,看代码就明白了。

    代码:

    public class Solution {
        public int[] singleNumber(int[] nums) {
            int sum = 0;    //记录所有异或的值,即两个只出现一次数的异或
            for(int i=0;i<nums.length;i++){
                sum ^= nums[i];
            }
            int[] res = new int[2];
    
            sum &= -sum;        //得出两个数异或结果的最右边的一个1,其他的为零,这样进行&操作就可以将两个不同的数分到不同的两组去
            for(int i=0;i<nums.length;i++){
                if((sum&nums[i])==0) res[0] ^= nums[i];
                else res[1]^=nums[i];
            }
            return res;
        }
    }
    

      

  • 相关阅读:
    从1到n中找到任意num个数的和为sum的所有组合
    算法导论5.12
    使用c++技术实现下载网页
    算法导论5.13
    感慨
    算法导论2.37
    [转载]Yahoo!的分布式数据平台PNUTS简介及感悟
    Bigtable 论文笔记
    GFS 论文笔记
    MapReduce论文笔记
  • 原文地址:https://www.cnblogs.com/271934Liao/p/7158888.html
Copyright © 2011-2022 走看看