做题收获
1.今天一道题卡了很久,我是算法菜鸟,脑子里面一直没有清晰的路线,今天尝试写了一下详细的题解来理顺思路,感觉很有用,所以分享一下
给定01字串,使相邻的1之间0的个数大于等于k。给定一个01字串,将其中的0变成1,还能成立,求能替换的数量
(1)这道题我一开始没有清晰的思路,很模糊的感觉,就迷糊的写了下去,因此出现了少考虑条件,但回头检查代码的时候,代码写的犹如乱麻,理不顺,只能重写,然而重写也不对。因此,浪费了很多时间
(2)我知道有些人称这些为水题,但本人菜鸟。因此,接下来我尝试谢了清晰的题解,各种情况罗列出来,就如同做数学题一样,题解如下:
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
(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); } }