做题收获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);
  }
}
相关文章
|
6月前
|
存储 网络协议 测试技术
复习软考之精读真题题解,猜猜这是哪年的真题吧
复习软考之精读真题题解,猜猜这是哪年的真题吧
34 0
|
算法 程序员
程序员可能越来越排斥面试时做题的原因
程序员可能越来越排斥面试时做题的原因
78 1
手把手带你刷好题(牛客刷题③)
手把手带你刷好题(牛客刷题③)
手把手带你刷好题(牛客刷题③)
做题日记1
最小值一定在序列A这里面如果A序列为升序则A序列的第一个就是最小值,所以每次二分取得中间值与最右边的值进行比较然后就能找到最小值了。
81 0
|
缓存 Java
手把手带你刷好题(牛客刷题④)
手把手带你刷好题(牛客刷题④)
专业课真题复习(2018)
专业课真题复习(2018)
95 0
专业课真题复习(2020)
专业课真题复习(2020)
97 0
专业课真题复习(2021)
专业课真题复习(2021)
117 0
下一篇
无影云桌面