在Python中从数字列表中更改0到1次k以找到最小可能总和的程序?
假设我们有一个名为nums的数字列表和另一个值k。我们必须进行以下操作k次:选择列表中的任何数字。在该数字的二进制表示中,选择一个为0的位并将其设为1。最后,我们必须返回执行k次操作后所有数字的可能最小总和。如果答案太高,则返回结果模10^9 + 7。
因此,如果输入为nums = [4, 7, 3] k = 2,则输出将为17,因为4的二进制表示为100,3为011,7为111。由于我们需要设置2个位,因此我们可以设置4的位以使其为111(7)。然后总和为7 + 7 + 3 = 17。
为了解决这个问题,我们将遵循以下步骤:
- ans := 0, i := 0
-
当k非零时,执行以下操作
- 对于nums中的每个n,请执行以下操作
- 如果(n/2^i)是偶数,则
-
ans:= ans + 2^i
-
k:= k – 1
-
如果k与0相同,那么
- 从循环中出来
- i := i + 1
- 对于nums中的每个n,请执行以下操作
-
返回(ans + nums的所有元素的总和)mod m
让我们看以下实现以获得更好的理解:
例子
class Solution:
def solve(self, nums, k):
m = (10 ** 9 + 7)
ans = 0
i = 0
while k:
for n in nums:
if (n >> i) & 1 == 0:
ans += 1 << i
k -= 1
if k == 0:
break
i += 1
return (ans + sum(nums)) % m
ob = Solution()
nums = [4, 7, 3]
k = 2
print(ob.solve(nums, k))
输入
[4, 7, 3], 2
输出
17