Как работает char и как он связан с английскими буквами? - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть следующая задача:

Создать метод, который принимает массив последовательных (увеличивающихся) букв в качестве входных данных и возвращает отсутствующую букву в массиве.

Вы всегда получите правильный массив.И всегда будет отсутствовать ровно одна буква.Длина массива всегда будет не меньше 2.

Массив всегда будет содержать буквы только в одном случае.

Пример:

['a','b','c','d','f'] -> 'e'
['O','Q','R','S'] -> 'P'

MyРешение, которое действительно плохое, таково:

public static char findMissingLetter(char[] array) {
    char[] alphabet = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

    int offset = 0;
    int point = 0;
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < alphabet.length; j++) {
            if (alphabet[j] == array[i]) {
                offset = j;
                point = offset + 1;
                if (alphabet[point] != array[++i]) {
                    System.out.println(alphabet[point]);
                    return alphabet[point];
                }
            }
        }
    }
    return ' ';
}

Теперь я нашел решение, которое действительно короткое, но я не понимаю код или, по крайней мере, я не понимаю, как без предоставления кода в спискеиз возможных букв он может знать, какая буква отсутствует:

public static char findMissingLetter(char[] array){
    char expectedLetter = array[0];
    for(char letter : array){
        if(letter != expectedLetter) break;
        expectedLetter++;
    }
    return expectedLetter;
}

Может кто-нибудь объяснить, как работает char и почему он знает, что отсутствует e, даже если я не предоставил массив всехбуквы?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Давайте использовать этот пример для объяснения:

['a','b','c','d','f'] -> 'e'

В Java char - это числовой тип.Когда вы добавляете 1 к символу, вы получаете следующий код Unicode.В случае «A» следующая кодовая точка - «B».

public static char findMissingLetter(char[] array){
    char expectedLetter = array[0]; // This code initializes expectedLetter
                                    // with the first character in the array.
    for(char letter : array){
        // The first iteration will always be true. From the second iteration,
        // if the character is not the consecutive one which is expected to be
        // equal to expectedLetter then that letter will be the missing one.
        // Once found, break will close the loop and return that character.
        if(letter != expectedLetter) break;

        // This will increment character consecutively from a -> b -> c -> d -> e
        expectedLetter++;
    }

    return expectedLetter;
}
0 голосов
/ 07 февраля 2019

Решение, которое вы дали, очень просто.Вам должно быть знакомо, что значение char интерпретируется как целочисленное значение, которое является числовым значением этого конкретного символа в таблице ASCII.

Таким образом, в решении после принятия начального значения expectedLetter (это первое значение в массиве char), оно проверяет числовое значение символов.Если они одинаковы, это означает, что они являются одним и тем же символом, поскольку вам говорят, что символы расположены в последовательном порядке и только в одном регистре букв.Таким образом, он увеличивает числовое значение expectedLetter (которое является следующим символом в таблице ASCII или вы можете сказать следующий символ в алфавитном порядке) и снова проверяет значение до конца массива.

...