问题描述
我在CodeWars上遇到了挑战,并且遇到了一个古怪的错误。这是问题陈述:
给出一串单词,您需要找到得分最高的单词。一个单词的每个字母都会根据其在字母表中的位置来给分数打分:a = 1,b = 2,c = 3,依此类推。您需要将得分最高的单词作为字符串返回。如果两个单词得分相同,则返回最早出现在原始字符串中的单词。所有字母均为小写,且所有输入均有效。
这是我编写的算法,在某些情况下不起作用:
public static String high(String s) {
String[] words = s.split(" ");
int[] scores = new int[words.length];
for (int j = 0; j < words.length; j++) {
for (int i = 0; i < words[j].length(); i++) {
scores[j] += (int) words[j].charat(i);
}
}
int highestWordindex = 0;
for (int i = 1; i < words.length; i++) {
if (scores[i] > scores[highestWordindex]) highestWordindex = i;
}
return words[highestWordindex];
}
但是,当我在嵌套的for循环中添加“-96”时,它可以工作。这是代码:
public static String high(String s) {
String[] words = s.split(" ");
int[] scores = new int[words.length];
for (int j = 0; j < words.length; j++) {
for (int i = 0; i < words[j].length(); i++) {
scores[j] += (int) words[j].charat(i) - 96;
}
}
int highestWordindex = 0;
for (int i = 1; i < words.length; i++) {
if (scores[i] > scores[highestWordindex]) highestWordindex = i;
}
return words[highestWordindex];
}
知道为什么会有所作为吗?
解决方法
'a'是十六进制0x61或十进制97。因此,当您使用-96时,使用的是正确的计算。我会做以下事情之一:
score += charAt() - 0x60;
OR
int offset = ('a' - 1);
...
score += charAt() - offset;
对于相等长度的单词,这没有什么区别,但是当单词长度不同时,多余的96个额外的点将使结果偏向更长的单词。
,当您减去96时,它起作用的原因是因为ASCII中小写字符的十进制值从97开始。例如,ASCII中的“ a”为97,所以97-96 = 1,这是必需的问题。
,'a'的(int)字符版本为97,'b'为98,'c'为99,依此类推。问题要求您将它们强制转换为1,2,3,...,这是有充分理由的。 考虑“ cab”一词与“ ox”一词。
“ cab”应为3 +1 + 2 =6。但是在您的实现中,它是99 + 97 + 98 = 294
“ ox”应为15 + 24 =39。但是在您的实现中为111 + 120 = 231
“ ox”的得分应高于“ cab”,但这不是因为您将字符转换为它们的ascii代表整数,而不是问题所要求的1-26。结果,您的算法会为更长的单词提供更多的分数,因为每个额外的字符会比问题多出96分。减去96会将您的得分域从97-122降低到1-26,这可以为您解决此问题。
希望这会有所帮助:)