做题收获2

简介: 做题收获

做题收获

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);
  }
}
相关文章
|
2月前
|
测试技术
蓝桥杯刷题|02入门真题
蓝桥杯刷题|02入门真题
|
2月前
|
测试技术
蓝桥杯刷题|01入门真题
蓝桥杯刷题|01入门真题
|
2月前
|
测试技术
蓝桥杯刷题|03入门真题
蓝桥杯刷题|03入门真题
|
11月前
|
存储 测试技术
蓝桥杯刷题篇①(上)
蓝桥杯刷题篇①(上)
78 0
|
12月前
|
算法 程序员
程序员可能越来越排斥面试时做题的原因
程序员可能越来越排斥面试时做题的原因
41 1
|
机器学习/深度学习
手把手带你刷好题(牛客刷题③)
手把手带你刷好题(牛客刷题③)
手把手带你刷好题(牛客刷题③)