洛谷 CF1570E 题解

题目传送门


题意:

Kotlin 编程,给定一个 \(01\) 字符串 \(s\),它只包含 \(0\)\(1\),求最少删掉多少个 \(0\) 使它变成连续 \(1\) 的字符串。


思路:

可以用类似双指针的做法,分别从字符串开头和结尾遍历,找到第一个是 \(1\) 的字符就结束循环并记录循环变量(假设 \(f\)\(r\)),最后从 \(f\)\(r\) 遍历,如果是 \(0\) 计数器就累加,最后输出答案。


C++ code:

#include <bits/stdc++.h>
using namespace std;
int n,cnt;
string st; 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cnt=0;	//切记初始化!! 
		cin>>st;
		int f=0,r=-1;
		int len=st.length(); 
		for(int i=0;i<len;i++){
			if(st[i]=='1'){
				f=i;break;
			}
		}
		for(int i=len-1;i>=0;i--){
			if(st[i]=='1'){
				r=i;break;
			}
		}
		for(int i=f;i<=r;i++)
			if(st[i]=='0')	cnt+=1;
		cout<<cnt<<endl;
	}
	return 0;
}



Kotlin code:

import java.util.Scanner
fun main(){
    val read=Scanner(System.`in`)
    var n=read.nextInt()
    var s=read.nextLine()
    for(i in 1..n){
        var st=read.nextLine()
        var f:Int=0
        var r:Int=-1
        var len:Int=st.length
        var cnt:Int=0
        for(i in 0..len-1)
            if(st[i]=='1'){
                f=i
                break
            }
        for(i in len-1 downTo 0)
            if(st[i]=='1'){
                r=i
                break
            }
        for(i in f..r)
            if(st[i]=='0') cnt=cnt+1
        println(cnt)
    }
}
posted @ 2022-03-06 18:41  Black--Panda  阅读(66)  评论(0编辑  收藏  举报