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

rkue9o1l  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(321)

我在做一个关于代码战的挑战,我得到了一个奇怪的错误。以下是问题陈述:
给定一串单词,你需要找到得分最高的单词。单词的每个字母根据其在字母表中的位置得分: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];
}

你知道这有什么不同吗?

7d7tgy0s

7d7tgy0s1#

“a”的(int)char版本是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,这为你解决了这个问题。
希望这有帮助:)

mec1mxoz

mec1mxoz2#

“a”是十六进制0x61或十进制97。所以当你-96时,你使用的是正确的计算。我会做一个:

score += charAt() - 0x60;

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

对于长度相等的单词,这没有什么区别,但是当单词长度不同时,超过96的额外点数会使结果向较长的单词倾斜。

gjmwrych

gjmwrych3#

减法96有效的原因是ascii中小写字符的十进制值从97开始。例如,ascii中的“a”是97,因此97-96=1,这是所需的问题。
ascii图表供参考

相关问题