程序通过从Python中的数字列表中将0s更改为1s 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不为零时,

    • 如果(n / 2 ^ i)是偶数,则

    • 从循环中出来

    • ans:= ans + 2 ^ i

    • k:= k-1

    • 如果k等于0,则

    • 对于每n个数字,执行

    • 我:=我+ 1

    • return(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
    猜你喜欢