Java:为字母表赋值并确定字符串的值

Java: Assign values to alphabet and determine value of a string

所以我正在尝试解决下面Java中的问题。有人可以告诉我如何处理这个问题吗?我只能想到使用一堆令人困惑的 for 循环来拆分 arr,遍历字母表,遍历每个字符串,即便如此,我还是对字符串与字符感到困惑。任何建议都会很棒。

--

假设字母 'A' 值 1,'B' 值 2,依此类推,'Z' 值 26。一个单词的值是所有单词的总和其中的字母值。给定一个由大写字母组成的单词数组arr,return值最大的手表的值。您可以假设 arr 的长度至少为 1.

{"AAA","BBB","CCC"} => 9

{"AAAA","B","C"} => 4

{"Z"} => 26

{"",""} => 0

--

这是我到目前为止尝试过的方法,但我迷路了:

public static int largestValue(String[] arr){
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int largest = 0;
    int wordTotal=0;

    for (int i = 0; i < arr.length; i++){
        String[] parts = arr[i].split("");

        if (wordTotal < largest){ //I don't think this is in the right place
            largest = 0;    }

        for (int j = 0; j < alphabet.length(); j++){

            for(int k = 0; k <parts.length; k++){
                if ( alphabet.charAt(j) == parts[k].charAt(0) ){
                    wordTotal = 0;
                    wordTotal += alphabet.indexOf(alphabet.charAt(j))+1;

                }
            }
        }
    }
    return largest;
}

我认为注意这里的两个关键部分会有所帮助:

1:你需要能够求出单个单词的值,即每个字母的总和

2:需要求所有词的值,求最大的

由于您需要遍历字符串中的每个元素 (letter/character) 以及数组中的每个元素(单词),因此问题实际上是为使用 2 个循环而设置的。我认为整个问题的一部分是让 for 循环清晰简洁,这绝对是可行的。我不想放弃它,但是有一个函数,给定一个词,returns 这个词的值,将会有所帮助。你可以找到一个词的值,看看它是否是迄今为止最大的,然后重复。此外,要查找单词的值, 不要使用 26 if's(改为查找 ASCII table!)。希望这能让你更好地理解而不泄露它!

我会开始 把问题分解成几个部分,第一步是总结一个String。要计算 sum 你可以迭代字符,测试字符是否在 'A''Z' 之间(尽管你的要求说你的输入保证有效),减去 'A'char 文字)并将其添加到您的 sum。像,

static int sumString(final String str) {
    int sum = 0;
    for (char ch : str.toCharArray()) {
        if (ch >= 'A' && ch <= 'Z') { // <-- validate input
            sum += 1 + ch - 'A';      // <-- 'A' - 'A' == 0, 'B' - 'A' == 1, etc.
        }
    }
    return sum;
}

然后可以迭代一个String(s)的数组得到最大和;像

static int maxString(String[] arr) {
    int max = sumString(arr[0]);
    for (int i = 1; i < arr.length; i++) {
        max = Math.max(max, sumString(arr[i]));
    }
    return max;
}

与Java8+

static int maxString(String[] arr) {
    return Stream.of(arr).mapToInt(x -> sumString(x)).max().getAsInt();
}

并且,最后,像

一样验证整个操作
public static void main(String[] args) {
    String[][] strings = { { "AAA", "BBB", "CCC" }, { "AAAA", "B", "C" },
            { "Z" }, { "", "" } };
    for (String[] arr : strings) {
        System.out.printf("%s => %d%n", Arrays.toString(arr), maxString(arr));
    }
}

然后我得到

[AAA, BBB, CCC] => 9
[AAAA, B, C] => 4
[Z] => 26
[, ] => 0