我最近完成了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)时间内运行。
答案 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;
}