**
2020-09-05做题收获
1.今天一道题卡了很久,我是算法菜鸟,脑子里面一直没有清晰的路线,今天尝试写了一下详细的题解来理顺思路,感觉很有用,所以分享一下
给定01字串,使相邻的1之间0的个数大于等于k。给定一个01字串,将其中的0变成1,还能成立,求能替换的数量
- 这道题我一开始没有清晰的思路,很模糊的感觉,就迷糊的写了下去,因此出现了少考虑条件,但回头检查代码的时候,代码写的犹如乱麻,理不顺,只能重写,然而重写也不对。因此,浪费了很多时间
- 我知道有些人称这些为水题,但本人菜鸟。因此,接下来我尝试谢了清晰的题解,各种情况罗列出来,就如同做数学题一样,题解如下
D题思路:查看间隔
第一种情况:当最少有两个1时,间隔为m,n(k+1)-1=m,n=(m+1)/(K+1),其中可以插入1的数量为 n-1
此时,两头的情况,满足n(K+1)=m,求插入1的数量n=m/(k+1);
第二种情况:当只有两个1时,参照情况1的两头
第三种情况:当一个1也没有的时候,如果间隔m>k+2,那么两头可以有两个1,中间间隔m1参照情况一
当m<k+2时,那么只能替换一个1,无论在哪里
3.然后我依据题解写出了代码,代码上也有思路清晰的注释
import java.util.Scanner;
public class D2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
while(t-->0) {
int n=sc.nextInt();
int k=sc.nextInt();
char[] ch=sc.next().toCharArray();
//遍历数组,找到1的位置
int one=0,two=0;//记录前后两个1的位置
int sum=0,num=0;
for (int i = 0; i < ch.length; i++) {
if(ch[i]=='1') {
num++;
two=i;
if(num==1) sum+=decide1(k,two);
else sum+=midDecide(one,two,k);
one=two;
}
}
if(num==0) {
//1.当n>k+2时
if(n>=(k+2))
sum+=2+(n-2+1)/(k+1)-1;
else
sum+=1;
}else {//之所以else是因为还有后头没进行
sum+=decide1(k,two,n);
}
System.out.println(sum);
}
}
private static int decide1(int k, int two, int n) {
//后头
return (n-two-1)/(k+1);
}
private static int midDecide(int one, int two, int k) {
int m=two-one-1;
int n=(m+1)/(k+1)-1;
return n;
}
private static int decide1(int k, int two) {
//前头
return two/(k+1);
}
}
789

被折叠的 条评论
为什么被折叠?



