最高评分字算法引发古怪错误

问题描述

我在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,这是必需的问题。

ASCII Chart for reference

,

'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,这可以为您解决此问题。

希望这会有所帮助:)