136. Single Number - Java

136. Single Number

https://leetcode.com/problems/single-number/

Description

Given a non-empty array of integers, every element appears twice except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

Input: [2,2,1]
Output: 1
Example 2:

Input: [4,1,2,1,2]
Output: 4

Solutions

我的思路:
先排序,single number只会出现在第0、2、4等偶数(从零开始啊)位。

异或的方法:
we use bitwise XOR to solve this problem :

first , we have to know the bitwise XOR in java
若两个输入的电平相异,则输出为高电平(1);若两个输入的电平相同,则输出为低电平(0)。
0 ^ N = N
N ^ N = 0
So… if N is the single number

N1 ^ N1 ^ N2 ^ N2 Nx ^ Nx ^ N

= (N1^N1) ^ (N2^N2) (Nx^Nx) ^ N

= 0 ^ 0 ^ …^ 0 ^ N

= N

Submissions

Arrays.sort():

class Solution {
    public int singleNumber(int[] nums) {
        Arrays.sort(nums);    
        for(int i=0;i<nums.length-1;i+=2)
        {
            if(nums[i]!=nums[i+1])            
                return nums[i];            
        }
        return nums[nums.length-1];
    }
}

XOR:

class Solution {
    public int singleNumber(int[] nums) {
        int result = 0;
        for (int num: nums) {
            result ^= num;
        }
        return result;
    }
}

Summary

Here’s the reason why it works. 1) XOR is commutative, a ^ b = b ^ a. 2) a number XOR by another number twice makes no change on original number, a ^ b ^ b = a
Therefore, if a number appears twice in the array, it makes no change to result. And if a number is unique, since 0 ^ unique = unique, so result = unique.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值