我们捋一哈思路: 归结为连续1的问题
对于上面这道题 就是把k个0变成1看哪里最长,是不是可以这么想,只要知道字符串中值为0的位置,以上面这道题为例:
标号: 0 1 2 3 4 5 6 7 8 9
字符串:1 0 0 1 0 1 0 1 0 1
值为0的index0[] 为: 1 2 4 6 8
k =2 的值可以是把坐标1 2 的值变为1 那么长度就是 4 index0[2]
k =2 的值可以是把坐标2 4 的值变为1 那么长度就是 4 index0[3] - index[0] - 1 即 6 - 1 - 1 =4
k =2 的值可以是把坐标4 6 的值变为1 那么长度就是 5 index0[4]-index[1] -1 即 8 - 2 - 1 = 5
k =2 的值可以是把坐标6 8 的值变为1 那么长度就是 5 string.length() - index[2] 即 10 - 4 - 1 = 5
我们可以发现 其实只要找到index0[] 中连续的连个为0的index即可 我们就以i表示第i个为0的index
i-1 是连续为1字串开始处的前一个0的index ,i + k 是连续为1字串结束处的后一个0的index
那么长度就是index0[i + k] - index0[i - 1] - 1;
在考虑开头处和结尾处的特殊情况
开头: index0[i + k]
结尾 如果i + k == index0[].length 那么直接就是String.length - index[i-1] - 1;
具体实现看代码
import java.util.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main{
public static void main(String[] args) throws IOException{
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(input);
String[] str2 = buffer.readLine().split(" ");
int n = Integer.parseInt(str2[0]);
int k = Integer.parseInt(str2[1]);
String[] str = buffer.readLine().split(" ");
List<Integer> list = new ArrayList<>();
//统计值是0的index
for(int i = 0; i < str.length; i++){
if(str[i].equals("0"))
list.add(i);
}
//如果为0的值小于等于k个 那么能输出连续的1必然是str的长度
if(k >= list.size()){
System.out.println(str.length);
}
int r = 0;
for(int i = 0; i <= list.size() - k; i++){
int cur = 0;
//开头处的处理
if(i - 1< 0)
cur = list.get(i+k) - 0;
//结尾处的处理
if(i + k == list.size())
cur = str.length - 1 - list.get(i-1);
//中间情况的处理
if(i-1 >= 0 && i + k < list.size())
cur = list.get(i + k) - list.get(i - 1) - 1;
r = Math.max(r, cur);
}
System.out.println(r);
}
}
参考:
https://www.nowcoder.com/profile/953850818/codeBookDetail?submissionId=47299435