美文网首页
位运算及其在面试中常用技巧

位运算及其在面试中常用技巧

作者: 湖底冰砚 | 来源:发表于2020-06-11 20:02 被阅读0次

    位运算,由于它直接操作在最底层速度快、内存消耗少、效率高,很多大厂的面试题也层出不穷,leetcode 上也有很多题是关于位运算的。

    1.常用位运算的分类

    符号 意义
    & 按位与
    | 按位或
    ~ 按位取反
    ^ 异或
    << 左移
    >> 右移

    2.位操作符介绍

    • &运算:两个相同时,才为1,否则为0
      1 1 0 1
      1 0 1 0
      -------------
      1 0 0 1
    • | 运算:任意一个为1,则运算结果为1
    • ~ 运算:~1 = 0,~0 = 1
    • ^ 运算:相异为1,相同为0
    • << 将数据左移一位
    • >> 将数据右移一位

    3. 位运算所蕴含的意义

    3.1 位运算交换两数值

    a = 1;b = 2
    a ^= b
    b ^= a
    a ^= b
    

    这样便用位操作实现了交换两数值,而不需要开辟额外的内存空间(pyhton不需要开辟额外的空间,但其他常见语言需要),速度与效率皆大大提高。

    3.2.位运算实现乘除

    a = 4
    a << 2  #结果为16
    a >> 2  #结果为1
    
    • 左移n位,就相当于原数2*n,低位补零,高位丢弃,有符号带符号(计算机以数据的补码保存数据,至于补码原码的知识,可以看看博主的这篇文章
    • 右移n位,相当于原数// 2**n,高位补零,有符号带符号。

    3.3 判断奇偶

    只需要将该数与1进行&操作

    3.4 位操作实现高低位交换

    只需将其数据左移8位、右移8位即可

    a = 0b10001101
    b = (a << 8)|(a >> 8)
    

    3.5 异或的骚操作

    以下内容基于力扣题目解答

    + 只出现一次的数字

    异或有一个性质:
    a^b^b = a

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    说明:

    你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

    示例 1:

    输入: [2,2,1]
    输出: 1
    示例 2:

    输入: [4,1,2,1,2]
    输出: 4

    class Solution:
        def singleNumber(self, nums: List[int]) -> int:
            num = 0
            for i in nums:
                num = num^i
    
            return num
    

    + 找出重复数

    给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
    
    示例 1:
    
    输入: [1,3,4,2,2]
    输出: 2
    示例 2:
    
    输入: [3,1,3,4,2]
    输出: 3
    说明:
    
    不能更改原数组(假设数组是只读的)。
    只能使用额外的 O(1) 的空间。
    时间复杂度小于 O(n2) 。
    数组中只有一个重复的数字,但它可能不止重复出现一次
    
    

    + 找不同

    给定两个字符串 s 和 t,它们只包含小写字母。
    
    字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
    
    请找出在 t 中被添加的字母。
    
     
    
    示例:
    
    输入:
    s = "abcd"
    t = "abcde"
    
    输出:
    e
    
    解释:
    'e' 是那个被添加的字母。
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/find-the-difference
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    

    异或运算骚操作比较多,由于本人理解也不够深刻,只能前往leetcode 加深印象。

    相关文章

      网友评论

          本文标题:位运算及其在面试中常用技巧

          本文链接:https://www.haomeiwen.com/subject/oljitktx.html