得分最高的单词算法抛出了一个奇怪的错误



我正在对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];
}

然而,当我加上"-96〃;在嵌套的for循环中,它起作用。这是代码:

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;

int offset = ('a' - 1);
...
score += charAt() - offset;

对于长度相等的单词,这不会有什么不同,但当单词长度不同时,多余96个单词中的额外点会使结果向更长的单词倾斜。

"a"的(int(char版本为97,"b"为98,"c"为99,依此类推。问题要求您将其强制转换为1,2,3,。。。有充分的理由。考虑一下cab这个词和ox这个词。

"驾驶室";应该是3+1+2=6。然而,在您的实现中,它是99+97+98=294

"牛;应为15+24=39。然而,在您的实现中,它是111+120=231

"牛;应该得分高于";驾驶室";,但这并不是因为你把你的字符转换成它们的ascii代表整数,而不是像问题所问的1-26。因此,你的算法会给较长的单词更多的分数,因为每个额外的字符都会比根据问题应该得到的分数多出96分。减去96将使你的分数域从97-122降到1-26,这为你解决了这个问题。

希望这有帮助:(

当您减去96时,它之所以有效,是因为ASCII中小写字符的十进制值从97开始。例如;a";在ASCII中是97,所以97-96=1,这是所需的问题。

参考的ASCII图表

相关内容

最新更新