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;
        }
    }
    

      

  • 相关阅读:
    redis持久化方案之RDB
    redis实现分布式锁
    redis数据类型(图解)
    js上拉加载
    apicloud直接上传图片
    layer.confirm
    json数组去重
    js解决手机键盘影响定位的问题
    click禁用事件
    ipcloud上传裁切图片,保存为base64再压缩传给后台
  • 原文地址:https://www.cnblogs.com/271934Liao/p/7158888.html
Copyright © 2011-2022 走看看