class Solution {
public int singleNonDuplicate(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] == nums[mid ^ 1]) {
/**
* 如果mid为偶数,mid^1=mid+1,如果mid=mid+1的话,左边都是偶数倍的个数,
* 那么这个出现一次的数就在mid右边,此时只需把left=mid+1,
* 如果mid为奇数,mid^1=mid-1,如果mid-1=mid的话,mid-1左边就是偶数倍的个数,
* 那么出现一次的数就在mid-1的右边,此时只需把left=mid+1,
*/
left = mid + 1;
} else {
/**
* 如果mid为偶数,mid^1!=mid+1,如果mid!=mid+1的话,左边都是奇数倍的个数,
* 那么这个出现一次的数就在mid左边,此时只需把right=mid,
* 如果mid为奇数,mid^1!=mid-1,如果mid-1!=mid的话,mid-1左边就是奇数倍的个数,
* 那么出现一次的数就在mid的左边,此时只需把right=mid,
*/
right = mid;
}
}
return nums[left];
}
}