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)。
推导过程
-
确定位数:首先,我们需要确定 (N) 的二进制表示的位数 (k)。这可以通过
bit_length()方法获得,它返回 (N) 的二进制表示中,不包括前导1的位数。 -
构造全1的二进制数:接下来,我们构造一个二进制数,它的长度为 (k+1)(因为包括前导1),并且所有位都是1。这可以通过 (1 << k) 实现,它将1左移 (k) 位,得到一个二进制数,其最低 (k) 位都是0,其余位都是1。
-
计算全1的十进制数:由于 (1 << k) 生成了一个二进制数,其中最低 (k) 位都是0,我们可以通过减去1来得到一个二进制数,其中所有位都是1。即 ((1 << k) - 1)。
-
得到反码:最后,我们从这个全1的数中减去 (N),得到 (N) 的二进制反码对应的十进制数。即 ((1 << k) - 1 - N)。
举例说明
假设 (N = 5),其二进制表示是 (101),我们想要得到它的反码。
-
确定位数:(5) 的二进制位数 (k = 3)(因为 (5) 的二进制是 (101))。
-
构造全1的二进制数:(1 << 3 = 1000_2)(十进制的8)。
-
计算全1的十进制数:((1 << 3) - 1 = 1000_2 - 1 = 0111_2)(十进制的7)。
-
得到反码:(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() 转换为小写字母