Python学习日志2021-01-28

二进制插入

给定两个整型数字 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值