一、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?
题目大意:
给出一个非空数组,除了一个出现一次的数字外,其它数字都出现两次,找出这个出现一次的数字。
要求时间复杂度为线性的,且不能开辟额外的空间。
二、Analyzation
想到除了单独的数字其它数字均出现两次,两两相消,可用异或操作来解决。
三、Accepted code
public int singleNumber(int[] nums) {
int result = 0;
for(int i = 0;i < nums.length;i++)
result ^= nums[i];
return result;
}
四、Another case
想到有一道面试题:找出一个数组中出现次数超过一半的数字,要求时间复杂度为O(n),代码如下:
public int find(int[] nums){
int count = 0,result = 0;
for(int i = 0;i < nums.length;i++){
if(count == 0){ //如果计数为0,则将当前数标记,并将count置为1
result = nums[i];
count = 1;
}else{
if(nums[i] == result){ //如果出现重复数字,count++
count++;
}else{ //如果和标记数不同,则count--
count--;
}
}
}
return result;
}