• Leetcode 位运算


    位运算

    程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作。
    
    • 1

    基本算法

    在这里插入图片描述

    详解:
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/0a1d3b9a6ffe47a0a6b21bd918353d20.png

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    Tips:

    解释下:假设有一个数为x,那么则有如下规律:
    0 ^ x = x
    
    x ^ x = 0
    
    x & ~x = 0
    
    x & ~0 =x
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    实战

    136. 只出现一次的数字

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
    
    说明:
    你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
    
    示例 1:
    输入: [2,2,1]
    输出: 1
    
    示例 2:
    输入: [4,1,2,1,2]
    输出: 4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    思路

    交换律:a ^ b ^ c <=> a ^ c ^ b
    
    任何数于0异或为任何数 0 ^ n => n
    
    相同的数异或为0: n ^ n => 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    class Solution:
        def singleNumber(self, nums: List[int]) -> int:
            res = 0
            for n in nums:
                res = res ^ n
    
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    137. 只出现一次的数字 II

    给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
    
    示例 1:
    输入:nums = [2,2,3,2]
    输出:3
    
    示例 2:
    输入:nums = [0,1,0,1,0,1,99]
    输出:99
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    思路

    代码参考热评。解释下:假设有一个数为x,那么则有如下规律:
    0 ^ x = x,
    
    x ^ x = 0;
    
    x & ~x = 0,
    
    x & ~0 =x;
    
    -那么就是很好解释上面的代码了。一开始a = 0, b = 0;
    
    x第一次出现后,a = (a ^ x) & ~b的结果为 a = x, b = (b ^ x) & ~a的结果为此时因为a = x了,所以b = 0。
    
    x第二次出现:a = (a ^ x) & ~b, a = (x ^ x) & ~0, a = 0; b = (b ^ x) & ~a 化简, b = (0 ^ x) & ~0 ,b = x;
    
    x第三次出现:a = (a ^ x) & ~b, a = (0 ^ x) & ~x ,a = 0; b = (b ^ x) & ~a 化简, b = (x ^ x) & ~0 , b = 0;所以出现三次同一个数,a和b最终都变回了0.
    
    只出现一次的数,按照上面x第一次出现的规律可知a = x, b = 0;因此最后返回a.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    class Solution:
        def singleNumber(self, nums: List[int]) -> int:
            ones, twos = 0, 0
            for num in nums:
                ones = ones ^ num & ~twos
                twos = twos ^ num & ~ones
            return ones
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    题目补充

  • 相关阅读:
    寒冬下的跑路与裁员...
    ElasticSearch入门
    SQL注入漏洞
    Allegro SigXplorer 等长设置方法-比较简单
    1103 Integer Factorization
    boost之string_ref
    Python零基础入门-9类
    Acwing 3534. 矩阵幂 && 3535. C翻转
    5.理解上下文Context
    计蒜客:C10 第四部分:深度优先搜索基础 引爆炸弹
  • 原文地址:https://blog.csdn.net/weixin_43692357/article/details/126482200