二分
class Solution { public int singleNonDuplicate(int[] nums) { int size = nums.length; if(size == 1) return nums[0]; int left = 0, right = size -1; //正常情况下偶数是第一个元素 while (left < right ) { int mid = left + ( (right - left) >> 1); if( (mid & 1) == 0 ){ if(nums[mid] == nums[mid + 1]) { left = mid + 1; } else { right = mid; } } else { if(nums[mid] == nums[ mid - 1] ) { left = mid + 1; } else { right = mid; } } } return nums[right]; }}
class Solution { public int singleNonDuplicate(int[] nums) { int size = nums.length; if(size == 1) return nums[0]; int left = 0, right = size -1; //正常情况下偶数是第一个元素 while (left < right ) { int mid = left + ( (right - left) >> 1); if( (mid & 1) == 0 ){ if(nums[mid] == nums[mid + 1]) { //[1,1,2,2,3] left = mid + 2 left = mid + 2; } else { right = mid; } } else { //[1,1,2] left + 1 if(nums[mid] == nums[ mid - 1] ) { left = mid + 1; } else { right = mid; } } } return nums[right]; }}
亦或
class Solution { public int singleNonDuplicate(int[] nums) { int left = 0,right = nums.length - 1; while (left < right ) { int mid = left + ((right - left) >> 1 ); //!!!偶数亦或1 等于 加1 //!!!奇数亦或1 等于 减1 if(nums[mid] == nums[mid ^ 1]) { left = mid + 1; } else { right = mid ; } } return nums[right]; }}