Problem Description
对于给定的一个字符串,统计其中数字字符出现的次数。
Input
输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
Output
对于每个测试实例,输出该串中数值的个数,每个输出占一行。
Sample Input
2 asdfasdf123123asdfasdf asdf111111111asdfasdfasdf
Sample Output
6 9
做这道题时候,用String的charAt()肯定能做出来,一个一个的分析。
我想用正则做,先把字符串里的数字串提取出来,放到数组或String里,因为他们有length的方法,可以直接知道其长度。
分析正则挺麻烦,很久没用正则了,还得看《正则表达式30分钟入门教程》(每次做正则都要看一遍这个。。)
然后下了一个code architects regex tester软件进行测试。
最后找到了所用的正则表达式“\d[0-9]*\d”,测试了一下,正确!还没去OJ就开始写这篇记录。
然后发现还没OJ,出错就糗大了,然后去OJ,结果还真WA了!!
然后又在code architects regex tester上测试了一串字符串“asdfasdf123123asdfasdf8763kasd-232182mkasdj-9023kede9kd939k3d93k”
这个字符串是包含单个数字的,再用“\d[0-9]*\d” 结果如下:
123123
8763
232182
9023
939
93
少了里面的单个的数字“9”和“3”。
再拼凑正则,测试“\d*[0-9]*\d”,输出如下:
123123
8763
232182
9023
9
939
3
93
这下正确了,修改了正则表达式再去OJ,AC~
代码如下:
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Q2017 { public static void main(String[] args) { Scanner s = new Scanner(System.in); while (s.hasNext()) { int n = s.nextInt(); for(int i = 0 ; i < n; i ++){ String str = s.next(); String regex = "\\d*[0-9]*\\d"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); int count = 0; while (m.find()) { String str2 = m.group(); count += str2.length(); } System.out.println(count); } } s.close(); } }
由此可见,其他WA的程序肯定是某个细节没有考虑到,慢慢挖掘吧。。