给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。
示例 1:
输入: nums = [1,1,2,3,3,4,4,8,8]
思路:本地的做法很多,这里考虑三种。二分查找:因为数组是有序数组,将数组中的数字每两个分为一组,先找出位于中间的一组,确定这一组的两个数组是否相同。如果这两个数字相同,那么只出现一次的数字一定在它的后面,此时查找它后半部分。如果不同,则检查这一组是不是第一组两个数字不相同的分组。如果是第1组,那么这一组的第1个数字就是只出现一次的数字。如果不是第1组,那么就查找它的前半部分。
class Solution {
public int singleNonDuplicate(int[] nums) {
int left = 0;
int right = nums.length / 2;
while(left <= right){
int mid = (left + right) / 2;
int i = mid * 2;
if(i < nums.length - 1 && nums[i] != nums[i+1]){
if(mid == 0 || nums[i - 2] == nums[i - 1]){
return nums[i];
}
right = mid - 1;
}else{
left = mid + 1;
}
}
return nums[nums.length - 1];
}
}
异或解法:因为两个相同的数字异或的结果是0,最终的结果就是只出现一次的数字。
class Solution {
public int singleNonDuplicate(int[] nums) {
int result = 0;
for(int num : nums){
result ^= num;
}
return result;
}
}
统计二进制位数再取余,结果就是只出现一次的数字
class Solution {
public int singleNonDuplicate(int[] nums) {
int []bitSum = new int[32];
for(int num : nums){
for(int i = 0; i < 32; i++){
bitSum[i] += (num >> (31 - i)) & 1;
}
}
int result = 0;
for(int i = 0; i < 32; i++){
result = (result << 1) + bitSum[i] % 2;
}
return result;
}
}