一个仅由整数组成的有序数组,其中每个元素都会出现两次,只有一个数字只会出现一次,设计一个算法找出这个数字并返回。
例如:
输入:[ 1,1,2,2,3,3,4,5,5 ]
输出:4
输入:[ 3,3,4,4,5,5,6 ]
输出:6
除了一个数字只会出现一次之外,其他每个数字都会出现两次,说明这个有序数组一定包含奇数个数字,并且只会出现一次的数字的下标一定是偶数。并且数组是有序的,可以用二分查找来获取结果。
int singleNonDuplicate(int* nums, int numsSize) {
int left=0;
int right=numsSize-1;
while(low<high){
int mid=left+(right-left)/2;//二分查找
mid-=mid&1;//奇数&1为1,偶数&1为0
if(nums[mid]==nums[mid+1]){//相等的话说明
left+=2;//只遍历偶数下标的数字
}
else right=mid;
}
return nums[left];
}