Я не совсем уверен, каково ваше определение «элегантного», но ваше решение в целом выглядит хорошо.
Несколько комментариев:
На самом деле вам не нужно вручную инициализировать массив в 0 при запуске, поскольку Java сделает это за вас
Поиск буквы с наивысшей частотой можно выполнить при подсчете символов
Например, цикл for
может стать:
int highestFreq = 0;
int highestFreqIdx = -1;
for (int k=0; k < code.length(); k++) {
if (code.charAt(k) >= 'a' && code.charAt(k) <= 'z') {
int count = freqs[code.charAt(k)-'a']++;
if (count > highestFreq) {
highestFreq = count;
highestFreqIdx = k;
}
}
}
Расчет ключа можно упростить
Если я не ошибаюсь, ваш ключ - это число позиций, на которых буква с самой высокой частотой находится вдали от «е».В этом случае вы можете просто сделать это:
key = biggest - ('e' - 'a');
Таким образом, ваш код станет:
public static String decode (String code){
int key = 0;
final int ALPHABET_SIZE = 26;
int[] freqs = new int[ALPHABET_SIZE];
int highestFreq = 0;
int highestFreqIdx = -1;
for (int k=0; k < code.length(); k++) {
if (code.charAt(k) >= 'a' && code.charAt(k) <= 'z') {
int count = freqs[code.charAt(k)-'a']++;
if (count > highestFreq) {
highestFreq = count;
highestFreqIdx = k;
}
}
}
key = highestFreqIdx - ('e' - 'a'); // Can also directly use 4 instead of 'e' - 'a'
return (decode(code, key));
}
При этом ваш код будет работать только для сообщений, которые действительно имеют букву 'e'как наиболее распространенное письмо ...
P / S Такие вопросы проверки кода могут быть лучше на этом сайте Stack Exchange для проверки кода вместо