/**
* 在一个排序数组中找出只出现一次的数字。
* 数组中除了一个元素只出现一次外,其余每个元素均出现两次,找出那个只出现了一次的元素。
*
* @param nums 输入的排序数组
* @return 只出现一次的数字
*/
public int singleNonDuplicate(int[] nums) {
// 初始化左指针为0,右指针为数组长度减1
int low = 0, high = nums.length - 1;
// 当左指针小于右指针时,执行循环
while (low < high) {
// 计算中间位置
int mid = (high - low) / 2 + low;
// 判断中间位置的元素是否等于其相邻元素
// mid ^ 1操作是一个巧妙的技巧,它可以实现如下功能:
// 如果mid是偶数,mid ^ 1就是mid + 1,即mid的下一个位置
// 如果mid是奇数,mid ^ 1就是mid - 1,即mid的前一个位置
// 这样就可以用mid和mid^1来比较中间位置的元素和它的相邻元素
if (nums[mid] == nums[mid ^ 1]) {
// 如果中间位置的元素等于其相邻元素,说明只出现一次的元素在mid的右侧
// 将左指针移动到mid的下一个位置
low = mid + 1;
} else {
// 如果中间位置的元素不等于其相邻元素,说明只出现一次的元素在mid或mid的左侧
// 将右指针移动到mid位置
high = mid;
}
}
// 当左指针等于右指针时,循环结束,此时low指向的就是只出现一次的元素
return nums[low];
}