2020-09-05

**

2020-09-05做题收获

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<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);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值