在减去ASCII值和简单地减去整数之间算法效率方面是否存在差异?

时间:2014-04-25 15:35:47

标签: java algorithm

我最近完成了TopCoder算法大赛单轮比赛618,问题很简单。给定一个仅包含从A到Z的大写字母的字符串,A = 1,B = 2等,Z = 26.目标是使用这些值返回字符串的总值。

这是我的算法:

public class WritingWords {
  public int write(String word) {
    int total = 0;
    word = word.replaceAll("\\s+","");

    for(int i = 0; i < word.length(); i++){
      total += (int)word.charAt(i)-64;
    }

    return total;
  }
}

我得到了~165 / 250的分数。

这是另一个获得~249 / 250的用户的代码:

public class WritingWords {
  public int write(String word) {
    int total = 0;

    for(int i = 0; i < word.length(); i++){
      total += word.charAt(i)-'A'+1;
    }

    return total;
  }
}

对我来说,两个源代码看起来非常相似,我不确定为什么我可能得到这么低的分数。后一种算法比我的算法效率高得多的原因是什么?在我看来,无论如何他们都会在O(n)时间内运行。

3 个答案:

答案 0 :(得分:2)

  

给定一个仅包含从A到Z的大写字母的字符串,A = 1,B = 2等,Z = 26.

鉴于问题陈述,这一行

word = word.replaceAll("\\s+","");

无用,无意义地迭代整个String值。

答案 1 :(得分:1)

total += (int)word.charAt(i)-64;total += word.charAt(i)-'A'+1;的运行速度非常快。问题出在这一行:

word = word.replaceAll("\\s+","");

这一行(仅在您的代码中)会降低您的程序速度。正如您在其他回复中所看到的,这一行是不必要的。

答案 2 :(得分:0)

total += word.charAt(i) - 64;

完全相同
total += (int) word.charAt(i) - 64;

相同
total += word.charAt(i) - 'A' + 1;

如果您想加快您的计划,请不要使用正则表达式

public int write(String word) {
    int total = 0;
    for(int i = 0; i < word.length(); i++) {
        char ch = word.charAt(i);
        if (ch >= 'A')
            total += word.charAt(i) - 64;
    }

    return total;
}