python 修改数组问题

题目描述
给定一个长度为 n、元素由 0 或 1 组成的数组。

现在可以选择若干(可以为 0)个值为 0 的元素,将其修改为 1。

注:

x为数组中最长连续 1 子段的长度(规定,若所有数均为 0,则 x 为 0);
y 为修改的元素的个数。
求要怎么修改才能使 x−y 最大,并构造一个方案(输出修改后的数组)。

输入格式
本题含有多组数据。

第一行一个整数 T 表示数据组数。

接下来 2×T 行,每 2 行表示一组数据。

在一组数据中,第一行一个整数 n,表示数组的长度;

第二行 n 个整数(0 或 1),表示给定的数组。

输出格式
共 2×T 行,每 2 行表示一组数据。

在一组数据中,第一行输出一个整数表示 x−y 的最大值;

第二行 n 个整数(0 或 1)表示修改以后的数组。如有多个方案,任意输出一种即可

输入输出样例

img

思路主要是:从 0修改为 1 的位置一定会属于最终序列的唯一的最长连续 1 子段( x-y最大值),所以全部改为 1。
代码出现了问题,还请帮看看

import itertools
T = int(input())

for i in range(T):
    a = int(input())
    b = input().split()
    y = b.count("0")#统计y变化的个数
    b = str(b)
    b = b.replace("0","1")#求x数组中最长连续1子段的长度
    x = max([len(list(v)) for k,v in itertools.groupby(b)])
    print(x-y)
    #麻烦主要是这几步,出现了问题
    
    print(b.strip("[]"))




就看题目中的例子
5
0 1 0 1 0
这里,如果把中间0改成1,最大长度增加了2,而修改数只增加了1,于是x-y就增加了1。
但是,如果修改头尾,就会发现最大长度增加1,修改数也只增加了1,x-y不变。因此,可以肯定的是,只要数组内仍然存在未相邻的1,x-y就不是最大,而若已经将全部1连接,则继续增加长度也没有意义了。

这个x,y,如果x是修改前的,那x-y可能是负数,如果x是修改之后的,那x-y就是最大连续1的长度
另:这个修改0是单独修改连续1的左边0或右边0,还是同时修改左右边的0,看你的例2,是同时修改