- 题目:一个数组中,只有一个元素只出现一次,其余元素都出现两次,找出出现一次的这个元素(时间复杂度要求为o(logn) 空间复杂度要求为o(1))
- 难度:Easy
思路:
- 方法一:先将数组排序,然后通过二分查找来找到single number,有序数组查找single number:LeetCode#540
方法二:通过位运算来找出single number(这个方法实在神奇)
0 ^ N = N N ^ N = 0 那么 N1 ^ N1 ^ N2 ^ N2 ^..............^ Nx ^ Nx ^ N = (N1^N1) ^ (N2^N2) ^..............^ (Nx^Nx) ^ N = 0 ^ 0 ^ ..........^ 0 ^ N = N
代码:
方法一的代码实现
public class Solution {
public int singleNumber(int[] nums) {
if(nums == null || nums.length == 0){
return -1;
}
int len = nums.length;
//len为1的情况需要单独考虑
if(len == 1){
return nums[0];
}
Arrays.sort(nums);
int left = 0;
int right = len-1;
while(left <= right){
int mid = left + (right-left);
if(mid == 0){
if(nums[mid] == nums[mid+1]){
left = 3;
}else{
return nums[mid];
}
}else if(mid == len-1){
if(nums[mid] == nums[mid-1]){
right = len-3;
}else{
return nums[mid];
}
}else{
//看mid位置的值和两边的值是否相等
if(nums[mid] != nums[mid-1] && nums[mid] != nums[mid+1]){
return nums[mid];
}else if(nums[mid] == nums[mid-1]){
if(mid%2 == 1){
left = mid+1;
}else{
right = mid-2;
}
}else{
if(mid%2 == 1){
right = mid-1;
}else{
left = mid+2;
}
}
}
}
return nums[right];
}
}
位运算的代码实现
public class Solution {
public int singleNumber(int[] nums) {
if(nums == null || nums.length == 0){
return -1;
}
Arrays.sort(nums);
int result = nums[0];
int len = nums.length;
for(int i = 1; i < len; i++){
result ^= nums[i];
}
return result;
}
}