二进制插入
给定两个整型数字 N 与 M,以及表示比特位置的 i 与 j(i <= j,且从 0 位开始计算)。
编写一种方法,使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域,不足之处用 0 补齐。
位运算符的应用
class Solution:
def insertBits(self, N: int, M: int, i: int, j: int) -> int:
for k in range(i, j+1):
N &= ~(1 << k)
return N | (M<<i)
二进制数转字符串
给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。
乘二取整法
每次对num乘以二,并取其整数位,作为二进制数的下一位。
class Solution:
def printBin(self, num: float) -> str:
res, i = "0.", 30
while num>0 and i:
num = 2*num
if num>=1:
res += "1"
num -= 1
else:
res += "0"
i -= 1
return res if not num else "ERROR"
翻转数位
给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。
动态规划解法
- pre表示上一个连续一的长度加1
- cur表示当前连续一的长度
- 结果为最大的pre+cur
- 循环结束后仍要再次更新res,因为最高位可能为1
class Solution:
def reverseBits(self, num: int) -> int:
pre, cur = 0, 0
res = 1
for i in range(32):
if num & (1<<i):
cur += 1
else:
res = max(res, pre+cur)
pre = cur + 1
cur = 0
res = max(res, pre+cur)
return res
配对交换
配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。
位运算符
- 对于奇数位,使用 10101010(即 0xAA)作为掩码,提取奇数位,并把它们右移一位
- 对于偶数位,使用 01010101(即 0x55)作为掩码,提取偶数位,并把它们左移一位
class Solution:
def exchangeBits(self, num: int) -> int:
return ((num & 0xaaaaaaaa) >> 1) | ((num & 0x55555555) << 1)
无重复字符串的排列
回溯算法
回溯法其实就是对一个树形图的深度遍历dfs
我们在每次进行回溯的时候需要对每个点保存两个变量
1、path:局部变量,记录了包含了当前节点的路径(包含了当前节点)
2、res:全局变量,记录满足条件的所有路径
class Solution:
def permutation(self, S: str) -> List[str]:
if S=="":
return []
res = []
path = ''
def backtrack(S, path, res):
if not S:
res.append(path)
return
for i in range(len(S)):
cur = S[i]
backtrack(S[:i]+S[i+1:],path+cur,res)
backtrack(S,path,res)
return res