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.