异或运算符 ^的好处--笔记

^ : 异或:相同为0,不同为1
性质:
1.任何数x 与0 异或的结果是它本身x
2.任何数x 与自身异或的结果为0;
3.偶数x与1异或的结果为自身加1(即x+1)
4.奇数x与1异或的结果为自身减1(即x-1)
========
leetcode题目:
给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。

请你找出并返回只出现一次的那个数。
示例 1:

输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:

输入: nums = [3,3,7,7,10,11,11]
输出: 10

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/single-element-in-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解一:
利用异或运算符 上面的1,2性质:

class Solution {
    
    
    public int singleNonDuplicate(int[] nums) {
    
    
         int ans = 0;
         for(int i = 0; i < nums.length;i++){
    
    
             ans ^= nums[i];
         }
         return ans;
    }
}

题解二:
利用二分法 + 3,4的性质:

class Solution {
    
    
    public int singleNonDuplicate(int[] nums) {
    
    
        int low = 0, high = nums.length - 1;
        while (low < high) {
    
    
            int mid = (high - low) / 2 + low;
            if (nums[mid] == nums[mid ^ 1]) {
    
    
                low = mid + 1;
            } else {
    
    
                high = mid;
            }
        }
        return nums[low];
    }
}

解题思路
根据题意我们可以得出,唯一元素左右两侧元素的区别是,左侧相同元素的下标是先偶后奇,而右侧则是先奇后偶。

例如:

nums : 1 1 2 3 3 4 4 8 8
index: 0 1 2 3 4 5 6 7 8
因此,我们可以对所有的偶数位下标进行二分查找,找到第一个 nums[mid] != nums[mid + 1] 的位置,即为唯一元素所在的位置。

其他细节
这里如果判断条件写 left <= right 的话,那么在 left == right 的条件下进入循环时,若数组长度只有 11 ,此时 left == right == mid == 1,计算 nums[mid + 1] 会导致越界
由于是对偶数位进行二分查找,mid 是奇数时需要将 mid 减 11,可以借助按位与运算 mid & 1 来规避奇偶判断,当 mid 为偶数时其值为 00,当 mid 为奇数时其值为 11
由于是对偶数位进行二分查找,移动左边界时要加 22,而不是加 11

作者:haonshi
链接:https://leetcode.cn/problems/single-element-in-a-sorted-array/solution/by-haonshi-8s3f/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/XJ200012/article/details/127556247