方法总结3|豆包MarsCode AI刷题

79 阅读3分钟

330 二进制反码转换问题

def solution(N: int) -> int:
    if N==0:
        return 1
    else:
        k = N.bit_length()
        # 计算反码对应的十进制数
        complement = (1 << k) - 1 - N
    
    return complement

要推导公式 ((1 << k) - 1 - N) 来计算一个非负整数 (N) 的二进制反码对应的十进制数,我们可以从理解二进制反码的概念开始。

二进制反码的概念

对于一个非负整数 (N),其二进制反码是将 (N) 的二进制表示中的所有1变为0,所有0变为1。例如,如果 (N) 的二进制表示是 (101)(十进制的5),它的反码就是 (010)(十进制的2)。

推导过程

  1. 确定位数:首先,我们需要确定 (N) 的二进制表示的位数 (k)。这可以通过 bit_length() 方法获得,它返回 (N) 的二进制表示中,不包括前导1的位数。

  2. 构造全1的二进制数:接下来,我们构造一个二进制数,它的长度为 (k+1)(因为包括前导1),并且所有位都是1。这可以通过 (1 << k) 实现,它将1左移 (k) 位,得到一个二进制数,其最低 (k) 位都是0,其余位都是1。

  3. 计算全1的十进制数:由于 (1 << k) 生成了一个二进制数,其中最低 (k) 位都是0,我们可以通过减去1来得到一个二进制数,其中所有位都是1。即 ((1 << k) - 1)。

  4. 得到反码:最后,我们从这个全1的数中减去 (N),得到 (N) 的二进制反码对应的十进制数。即 ((1 << k) - 1 - N)。

举例说明

假设 (N = 5),其二进制表示是 (101),我们想要得到它的反码。

  1. 确定位数:(5) 的二进制位数 (k = 3)(因为 (5) 的二进制是 (101))。

  2. 构造全1的二进制数:(1 << 3 = 1000_2)(十进制的8)。

  3. 计算全1的十进制数:((1 << 3) - 1 = 1000_2 - 1 = 0111_2)(十进制的7)。

  4. 得到反码:(7 - 5 = 2),所以 (5) 的反码是 (2)。

因此,公式 ((1 << k) - 1 - N) 可以用来计算一个非负整数 (N) 的二进制反码对应的十进制数。这个公式利用了位运算的高效性,直接在二进制层面上进行计算,避免了复杂的循环和条件判断。

226小T的密码变换规则

def solution(s: str) -> str:
    # 创建小写字母到数字的映射字典
    letter_to_digit = {
        'a': '2', 'b': '2', 'c': '2',
        'd': '3', 'e': '3', 'f': '3',
        'g': '4', 'h': '4', 'i': '4',
        'j': '5', 'k': '5', 'l': '5',
        'm': '6', 'n': '6', 'o': '6',
        'p': '7', 'q': '7', 'r': '7', 's': '7',
        't': '8', 'u': '8', 'v': '8',
        'w': '9', 'x': '9', 'y': '9', 'z': '9'
    }
    ss='abcdefghijklmnopqrstuvwxyz'
    re=[]
    for char in s:
        if char.islower():
            re.append(letter_to_digit[char])
        elif char.isupper():
            if char == 'A':
                # 特殊处理 'A'
                re.append('9')
            else:
                # 转换为小写字母并跳到前一个字母
                lower_char = chr(ord(char.lower()) - 1)
                re.append(letter_to_digit[lower_char])
        else:
            # 非字母字符保持不变
            re.append(char)
   return ''.join(re)

学习记录
islower() 判断是否为小写字母
isupper() 判断是否为大写字母
ord() ASCLL转换为数值
lower() 转换为小写字母