位与运算技巧:
- n&(n-1) 去除 n 的位级表示中最低的那一位。例如对于二进制表示 10110100,减去 1 得到 10110011,这两个数相与得到 10110000。
- n&(-n) 得到 n 的位级表示中最低的那一位。-n 得到 n 的反码加 1,对于二进制表示 10110100,-n 得到 01001100,相与得到 00000100。
- n-n&(~n+1) 去除 n 的位级表示中最高的那一位。
移位运算:
- >> n 为算术右移,相当于除以 2n;
- >>> n 为无符号右移,左边会补上 0。
- << n 为算术左移,相当于乘以 2n。
掩码
要得到 1 到 i 位为 1 的 mask,1<<(i+1)-1 即可,例如将 1<<(4+1)-1 = 00010000-1 = 00001111。
要得到 1 到 i 位为 0 的 mask,只需将 1 到 i 位为 1 的 mask 取反,即 ~(1<<(i+1)-1)。
1018. 可被 5 整除的二进制前缀
思路:尽量不要通过int(str,2)转换成10进制,太慢 。时间超越78%的python提交用户,内存超越64%的python提交用户
1 class Solution(object): 2 def prefixesDivBy5(self, A): 3 res=[] 4 val=0 5 for each in A: 6 val=val*2+each # 左移增大2倍 7 res.append(True if val % 5 == 0 else False) 8 return res
思路二:慢 时间比思路一慢4倍
1 class Solution(object): 2 def prefixesDivBy5(self, A): 3 res = [] 4 A = "".join([str(i) for i in A]) 5 for i in range(len(A)): 6 if int(A[:i+1], 2) % 5 == 0: 7 res.append(True) 8 else: 9 res.append(False) 10 return res 11 12 13
1017. 负二进制转换
思路:先计算余数,然后减去余数后在除以-2 。时间超越100%的python用户提交,内存超越17.95%的python用户提交
1 class Solution(object): 2 def baseNeg2(self, N): 3 if N==0: 4 return "0" 5 res=[] 6 while N: 7 res.append(abs(N%(-2))) 8 N=(N-res[-1])//(-2) 9 return "".join([str(x) for x in res[::-1]]) 10
1016. 子串能表示从 1 到 N 数字的二进制串
思路:大佬说:[1024, 2047]这些数字均为11位二进制表示,并且彼此不同,而11位的子串只有S.length()-10<990个,所以N>2047不可能。
具体为什么我也不清楚。
1 class Solution(object): 2 def queryString(self, S, N): 3 """ 4 :type S: str 5 :type N: int 6 :rtype: bool 7 """ 8 if N>2047: # 不然第25个测试用例无法通过 9 return False 10 for i in range(1,N+1): 11 if bin(i)[2:] not in S: 12 return False 13 return True 14
1015. 可被 K 整除的最小整数
思路:设置一个变量j记录数字的长度。 时间 超越100%的Python提交。内存超越100%的用户提交
class Solution(object): def smallestRepunitDivByK(self, K): """ :type K: int :rtype: int """ if K%2==0 or K%5==0: return -1 i,j=1,1 while i%K!=0: i%=K i=i*10+1 j+=1 return j
461. 汉明距离
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x
和 y
,计算它们之间的汉明距离。
思路:两个数进行异或运算后统计“1”出现的次数即可
1 class Solution(object): 2 def hammingDistance(self, x, y): 3 z=x^y 4 res=0 5 while z!=0: 6 if z&1==1: 7 res+=1 8 z=z>>1 9 return res 10
思路:n&(n-1) 去除 n 的位级表示中最低的那一位。例如对于二进制表示 10110100,减去 1 得到 10110011,这两个数相与得到 10110000。
1 class Solution(object): 2 def hammingDistance(self, x, y): 3 z=x^y 4 res=0 5 while z!=0: 6 z=z&(z-1) 7 res+=1 8 return res 9
136. 只出现一次的数字
思路:如果出现两次数进行异或运算后结果为零。
1 class Solution(object): 2 def singleNumber(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: int 6 """ 7 res=0 8 for each in nums: 9 res=res^each 10 return res 11 12
260. 只出现一次的数字 III
给定一个整数数组 nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
1 class Solution(object): 2 def singleNumber(self, nums): 3 d = {} 4 for each in nums: 5 if each in d: 6 d.pop(each) 7 else: 8 d[each]=0 9 return d.keys()
268. 缺失数字
class Solution(object): def missingNumber(self, nums): res=0 for i in range(len(nums)): res=res^nums[i]^i return res^len(nums)
190. 颠倒二进制位
1 class Solution: 2 # @param n, an integer 3 # @return an integer 4 def reverseBits(self, n): 5 b=bin(n)[2:] 6 length=len(b) 7 temp="0"*(32-length)+b 8 return int(temp[::-1],2) 9 10
231. 2的幂
思路: 2的幂的二进制串中只有一个人
1 class Solution(object): 2 def isPowerOfTwo(self, n): 3 """ 4 :type n: int 5 :rtype: bool 6 """ 7 return n>0 and bin(n)[2:].count("1")==1
342. 4的幂
思路:二进制只会出现一个“1”,并且出现在奇数位, 此外大佬说:0x5 = 0101b
可以用来校验奇数位上的1
1 class Solution(object): 2 def isPowerOfFour(self, num): 3 """ 4 :type num: int 5 :rtype: bool 6 """ 7 if num<0 or num&(num-1): 8 return False 9 return num &(0x55555555) 10
693. 交替位二进制数
1 class Solution(object): 2 def hasAlternatingBits(self, n): 3 """ 4 :type n: int 5 :rtype: bool 6 """ 7 a= n^(n>>1) 8 return n>0 and a&(a+1)==0
476. 数字的补数
1 class Solution(object): 2 def findComplement(self, num): 3 """ 4 :type num: int 5 :rtype: int 6 """ 7 if num == 0: return 1 8 mask = 1 << 30 9 while ((num & mask) == 0): mask >>= 1 10 mask = (mask << 1) - 1 11 return num ^ mask
1009. 十进制整数的反码
每个非负整数 N
都有其二进制表示。例如, 5
可以被表示为二进制 "101"
,11
可以用二进制 "1011"
表示,依此类推。注意,除 N = 0
外,任何二进制表示中都不含前导零。
二进制的反码表示是将每个 1
改为 0
且每个 0
变为 1
。例如,二进制数 "101"
的二进制反码为 "010"
。
给定十进制数 N
,返回其二进制表示的反码所对应的十进制整数。
思路:n与1串做异或算法得到n的反码
1 class Solution(object): 2 def bitwiseComplement(self, N): 3 """ 4 :type N: int 5 :rtype: int 6 """ 7 return int(len(bin(N)[2:])*"1",2)^N