首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CamelCase字数

CamelCase字数
EN

Code Review用户
提问于 2016-12-27 05:14:03
回答 1查看 4.2K关注 0票数 1

黑客等级上的在线挑战。

问题描述艾丽斯用CamelCase写了一个单词序列,作为一个字母字符串,S,具有以下属性:它是一个或多个由英文字母组成的单词的连接。第一个单词中的所有字母都是小写字母。对于后面的每个单词,第一个字母是大写字母,其余字母是小写字母。给定时,在新行上打印单词数。输入格式包含字符串S的一行。约束输出格式打印字符串中的字数。样本输入saveChangesInTheEditor样本输出5

代码语言:javascript
复制
public class Solution {
    private static int solve(String input) {
        int len = input.length();
        if (len == 0) {
            return 0;
        }
        int count = 1;
        for (int i = 0; i < len; i++) {
            char c = input.charAt(i);
            if ('A' <= c && c <= 'Z') {
                count++;
            }
            else if (c == ' ') {
                break;
            }
        }
        return count;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        System.out.println(solve(s));
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2016-12-27 08:59:24

明显的缺陷

  1. 你干吗呢?您没有费心解释您的算法,无论是在问题体或程序注释。
  2. 虫子。正如@Abhisek所指出的,您的代码打印3而不是2。当您计算camelCase单词的数量时,您应该忽略空格,实际上,您应该将任何非字母字符视为小写,这是我对问题的理解(尽管这是一个边缘情况)。
  3. 您没有费心使用任何Java的标准库。您会发现Character.isUpperCase(char)Character.isLowerCase(char)Character.isWhitespace(char)函数非常有用,而不是进行容易出错和语言受限的手动检查。而且,String.isEmpty()总是比String.length() == 0更好的检查。
  4. 非描述性命名。您的方法确实解决了一个HackerRank问题,但这并不能恰当地描述它。您可以根据它所做的事情来命名它,类似于getCamelCaseWordCount(String),按照一些Java命名准则(有效Java由乔舒亚·布洛赫编写)。
  5. 您只使用len一次,而不需要检查空值。事实上,这也不是必需的,因为一般代码也会处理这个问题。只需使用空检查将单词计数的初始值设置为01,这取决于输入是空的还是非空的。分别使用。您不需要提前返回以避免循环,因为循环一开始不会迭代。
  6. 因此,由于Strings是不可变的,在同一个String对象上反复调用.length()没有太多开销,所以即使您关心循环,也不需要len
  7. 避免所有len业务,并使用for-each循环。类似于: for(char c: input.toCharArray()){//for JDK 1.5+ .}或,for(char c: input.chars()){//for JDK 1.8+ .}
  8. 和往常一样,这是一个带有Java 8流的1行。这是完全等价的:返回in.isEmpty()?0:1+in.isEmpty注意,上面的内容返回的是long,而不是int。这是根据Stream编写的。

把一切都放在一起,

修改代码

代码语言:javascript
复制
public class Test{
    public static long getCamelCaseWordCountNormal(String in){
        long words = in.isEmpty() ? 0 : 1;
        for(char c : in.toCharArray()){
            if(Character.isUpperCase(c)){
                words++;
            }
        }
        return words;
    }

    public static long getCamelCaseWordCountStreams(String in){
        return in.isEmpty() ? 0 : 1 + in.chars().filter(Character::isUpperCase).count();
    }
}
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/150917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档