算法分析 [位运算] 2019-03-14

1. 基本原理

x ^ 0s = x      x & 0s = 0      x | 0s = x
x ^ 1s = ~x     x & 1s = x      x | 1s = 1s
x ^ x = 0       x & x = x       x | x = x
  • 利用x ^ 1s = ~x的特点,可以将位级表示翻转;利用 x ^ x = 0的特点,可以将三个数中重复的两个数去除,只留下另一个数
  • 利用x & 0s = 0x & 1s = x的特点,可以实现掩码操作。一个数 num 与 mask:00111100 进行位与操作,只保留 num 中与 mask 的 1 部分相对应的位
  • 利用 x | 0s = xx | 1s = 1s 的特点,可以实现设值操作。一个数 num 与 mask:00111100 进行位或操作,将 num 中与 mask 的 1 部分相对应的位都设置为 1

位运算技巧:

  • n&(n-1)去除 n 的位级表示中最低的那一位。例如对于二进制表示 10110100,减去 1 得到 10110011,这两个数相与得到 10110000。
  • n&(-n) 得到 n 的位级表示中最低的那一位。-n 得到 n 的反码加 1,对于二进制表示 10110100,-n 得到 01001100,相与得到 00000100。
  • n-n&(~n+1) 去除 n 的位级表示中最高的那一位

2. 计算

540. 有序数组中找出单独存在的数,其余的数都是成对出现 Single Element in a Sorted Array
法1. 时间复杂度O(n) 空间复杂度O(2)
使用stack,利用有序和成对出现pop+push,最后stack的最后一个值是单数
法2. 时间复杂度O(n) 空间复杂度O(1)
利用数学^异或公式-> x ^ 0 = x, x ^ x = 0,遍历最后剩下的是单数
法3. 时间复杂度O(logn) 空间复杂度O(1)
折半法,每次将后一半的值与前一半的值做^异或,如果计算长度是奇数nums[0]^=nums[mid],折半缩小范围

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容