import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        StringBuffer strb = new StringBuffer();
        String input = null;
        String tmpstr = null;
        String[] splitstr = null;
        int sum=0;
        while (in.hasNextLine()) { 
            strb.append("1");
            input = in.nextLine();
            strb.append(input).append("1");
            tmpstr=strb.toString();
            splitstr = tmpstr.split("[A-Z]");
            sum = splitstr.length-1;
            strb.delete(0,strb.length());
            System.out.println(sum);
        }
    }
}

先上代码.本题目有多组数据输入,需要while死循环.当然也不能重复new新变量,会导致内存溢出,故所有变量都定义在while死循环外部.

使用StringBuffer来实现多次利用,且append方法比字符串的+更高效.由于没有直接清空内容的方法,使用了delete方法来清空数据.

笔者没有判断输入的字符串首尾是否有大写字母,而是取巧,头尾都追加字符串内容"1"(或者其它不是A-Z的内容均可),这样就可以确保将传入的字符串插入中间后两侧一定没有A-Z.

StringBuffer比较头疼的地方就是没有split方法,只好先转换为字符串对象,然后使用了正则匹配的方式,[A-Z]这样些就是匹配大写的26个字母.切分出的字符串数组的长度刚好比用于拆分的大写字母个数多1,-1之后即为正确的结果.