AI 刷题(三) | 豆包MarsCode AI刷题

56 阅读3分钟

位运算


最大异或和计算

问题描述

给定两个长度为 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')