解题思路:
当我们从头遍历时,要明白一点是,不要考虑前面的位置,有点动态规划的想法,即前面做的已经是最对的了,前面已经把当前的考虑进去了(代码有所体现),所以我们只考虑当前位置及以后。
当前位置只能影响我们的下一位置,影响不到下下位置
理由:因为当我们认为我们当前位置可以影响到下一位置时,潜意识里就认为,可能我们放弃当前位置组成字串时,后面可以组成更多的字串,但事实并不是这样,
当前位置放弃后,顶多会使我们的下一位置与下下位置组成字串,即多一个字串,那既然要多一个字串,为什么我们不利用当前字符,而是选择下一个呢?
注意事项:
无
参考代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.*;
public class Main {
public static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
public static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static PrintWriter count = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws Exception {
String s = Line();
//遇到?在进行操作即可 首先我们要明白 一个数只能存在一个字串里面 不能在两个字串扮演角色
//那会不会出现这样的 1?00001 这种 假如我们选择?为1 有三个字串 选择?为0 却只有两个
//选择贪心算法 优先匹配第一个即可 因为你选择不匹配第一个就意味着你丢弃了一个字符串 除非你丢弃的结果是你可以凑出来两个 不可能嘛
int sum = 0;
for (int i = 0; i < s.length() - 1; i++) {
//我只担心我的下一个
char c = s.charAt(i);
if (c == '1') {
char cc = s.charAt(i + 1);
if (cc == '1' || cc == '?') {
sum++;
i++;
//这个数不再考虑
}
} else if (c == '0') {
char cc = s.charAt(i + 1);
if (cc == '0' || cc == '?') {
sum++;
i++;
//这个数不再考虑
}
} else if (c == '?') {
//优先凑成
sum++;
i++;
}
}
count.print(sum);
closeAll();
}
public static int nextInt() throws Exception {
cin.nextToken();
return (int) cin.nval;
}
public static long nextLong() throws Exception {
cin.nextToken();
return (long) cin.nval;
}
public static double nextDouble() throws Exception {
cin.nextToken();
return cin.nval;
}
public static String nextString() throws Exception {
cin.nextToken();
return cin.sval;
}
public static String Line() throws Exception {
String p = "";
p = in.readLine();
return p;
}
public static void closeAll() throws Exception {
count.close();
in.close();
out.close();
}
}
0.0分
7 人评分
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:590 |
数列排序 (C语言代码)浏览:858 |
蓝桥杯历届试题-九宫重排 (C++代码)浏览:2812 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:643 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:634 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:504 |
用筛法求之N内的素数。 (C语言代码)浏览:685 |
printf基础练习2 (C语言代码)浏览:796 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:913 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:903 |