在Python中找出可以翻转为0的所有列表项并计数的程序
假设我们有一个名为nums的数字列表,其中存储0和1。我们有另一个值k。
现在考虑有一种操作,我们翻转长度为k的子列表,使所有1都成为0,所有0都成为1。我们必须找到将nums更改为所有1到0所需的最小操作次数。如果我们无法更改它,则返回-1。
因此,如果输入像nums = [1,1,1,0,0,1,1,1],k = 3,则输出将是2,因为我们可以将前三个数字翻转为零,然后将最后三个数字翻转为零。
要解决此问题,我们将按以下步骤执行以下操作:
- n:= nums的大小
-
res:= 0,翻转:= 0
-
to_conv:=大小为n的列表,并填充为0
-
对于i在0到n之间的范围,执行以下操作
- flipped:= flipped XOR to_conv [i]
-
cur:= nums [i]
-
cur:= cur XOR flipped
-
如果cur与1相同,则
- flipped:= flipped XOR 1
-
res:= res + 1
-
如果i + k-1> = n,则
-
返回 -1
-
如果i + k
- to_conv [i + k]:= 1
- flipped:= flipped XOR to_conv [i]
-
返回res
范例
让我们查看以下实现以更好地理解 –
class Solution:
def solve(self, nums, k):
n = len(nums)
res = 0
flipped = 0
to_conv = [0] * n
for i in range(n):
flipped ^= to_conv[i]
cur = nums[i]
cur ^= flipped
if cur == 1:
flipped ^= 1
res += 1
if i + k - 1 >= n:
return -1
if i + k < n:
to_conv[i + k] = 1
return res
ob = Solution()
nums = [1,1,1,0,0,1,1,1]
k = 3
print(ob.solve(nums, k))
输入
[1,1,1,0,0,1,1,1], 3
输出
2