位运算
最大异或和计算
问题描述
给定两个长度为 n 的数组 a 和 b,定义 f(c) 为数组 c 的所有元素的总和。现在,你需要恰好删除数组 a 或者数组 b 中的一个元素,使得 f(a) 和 f(b) 的异或结果最大。请输出这个最大的异或和。
测试样例
样例1:
输入:
n = 3,a = [1, 2, 3],b = [3, 2, 1]
输出:5
样例2:
输入:
n = 4,a = [4, 5, 6, 7],b = [7, 8, 9, 10]
输出:51
样例3:
输入:
n = 5,a = [10, 20, 30, 40, 50],b = [50, 40, 30, 20, 10]
输出:248
解题思路
算法步骤
代码
def solution(n: int, a: list, b: list) -> int:
# write code here
sum_a = sum(a)
sum_b = sum(b)
max_xor = 0
# 尝试删除数组 a 中的每个元素
for i in range(n):
new_sum_a = sum_a - a[i]
max_xor = max(max_xor, new_sum_a ^ sum_b)
# 尝试删除数组 b 中的每个元素
for i in range(n):
new_sum_b = sum_b - b[i]
max_xor = max(max_xor, sum_a ^ new_sum_b)
return max_xor
if __name__ == '__main__':
print(solution(3, [1, 2, 3], [3, 2, 1]) == 5)
print(solution(4, [4, 5, 6, 7], [7, 8, 9, 10]) == 51)
print(solution(5, [10, 20, 30, 40, 50], [50, 40, 30, 20, 10]) == 248)
查找按位 XOR 等于 2 的整数对问题
问题描述
小S需要找到在两个整数 L 和 R 之间是否存在两个整数,其按位 XOR 运算的结果为 2。你的任务是判断是否存在这样的整数对。如果存在,返回 1;否则,返回 0。
例如,给定 L = 2 和 R = 7,(4, 6) 的按位 XOR 结果为 2,并且 4 和 6 都在范围内。因此,答案为 1。
测试样例
样例1:
输入:
L = 2,R = 7
输出:1
样例2:
输入:
L = 1,R = 4
输出:1
样例3:
输入:
L = 5,R = 10
输出:1
按位 XOR 的性质
- 按位 XOR 运算的结果为 2,意味着
a和b在二进制表示中,只有第 2 位(从右往左数,从 0 开始计数)不同,其他位相同。 - 例如,
2的二进制表示是10,所以a和b的二进制表示中,只有第 2 位不同。
代码
def solution(L: int, R: int) -> int:
# 遍历范围内的每一个整数
for a in range(L, R + 1):
# 检查是否存在 b 使得 a ^ b = 2
b = a ^ 2
if L <= b <= R:
return 1
return 0
if __name__ == '__main__':
print(solution(L = 2, R = 7) == 1)
print(solution(L = 1, R = 4) == 1)
print(solution(L = 5, R = 10) == 1)
负二进制表示问题
问题描述
小U最近了解到负二进制(base -2)的表示方法。现在给定一个整数 n,小U希望将该整数以负二进制的形式表示,并返回其对应的二进制字符串。注意,除非结果是 "0",否则返回的字符串中不能包含前导零。
负二进制是一种非标准的进制表示,使用基数 -2 而非通常的 2。在负二进制中,数位的权值是按 (-2)^i 来计算的。
测试样例
样例1:
输入:
n = 2
输出:'110'
样例2:
输入:
n = 3
输出:'111'
样例3:
输入:
n = 0
输出:'0'
代码
def solution(n: int) -> str:
# write code here
if n == 0:
return '0'
result = []
while n != 0:
# 计算余数和商
remainder = n % -2
n = n // -2
# 如果余数为负数,调整商和余数
if remainder < 0:
remainder += 2
n += 1
# 将余数添加到结果列表
result.append(str(remainder))
# 反转结果列表并拼接成字符串
return ''.join(result[::-1])
if __name__ == '__main__':
print(solution(n=2) == '110')
print(solution(n=3) == '111')
print(solution(n=0) == '0')