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


    ^ : 异或:相同为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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    题解二:
    利用二分法 + 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];
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    例如:

    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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    kafka安装步骤以及初步入门
    Jmeter接口测试
    Pikachu漏洞练习平台----验证码绕过(on server) 的深层次理解
    数据库--mysql(SQL语句)
    还记得高中生物书上的莫斯密码吗?利用Python破解摩斯密码的代码示例!
    【C++ Primer Plus学习记录】第4章编程练习
    张雪峰说网络空间安全专业
    centos部署nginx集群
    进程与线程复习知识点
    python二分查找
  • 原文地址:https://blog.csdn.net/XJ200012/article/details/127556247