#php
#php
Вопрос:
Учитывая строку слов, мне нужно найти слово с наибольшим количеством баллов. Каждая буква слова набирает очки в соответствии со своей позицией в алфавите: a = 1, b = 2, c = 3 и т.д. Мне нужно вернуть слово с наибольшим количеством баллов в виде строки.
Таким образом, в строке 'man i need a taxi up to ubud'
правильной возвращаемой строкой будет taxi, поскольку в ней есть буквы с высоким значением, такие как t и x.
Моя путаница заключается в том, как присвоить каждой букве в каждом слове значение. Я понимаю, что нужно разбить входную строку, а затем выполнить поиск по ней, чтобы разбить слова, но как увеличить значение в зависимости от порядка в алфавите? Я очень смущен.
function high($x) {
$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"];
$nA = array_flip($alphabet);
$words = explode(" ", $x);
foreach($words as $w) {
explode("", $w);
}
return "";
}
Комментарии:
1. Почему бы не разделить ваш алгоритм? Одна часть «разделена по слову», другая «генерирует оценку за слово». Итак, что вы пытались заставить это работать? Где ты застрял?
2. Моя проблема заключается в соединении двух. Предполагается, что это должно быть в пределах одной функции, я не могу придумать, как соединить разделение и генерирование оценки.
3. Из любопытства: зачем вам нужна одна функция? Сделайте его двумя, чтобы разделить проблемы. Если хотите, вы можете объединить это позже, но разделение его во время разработки может помочь
Ответ №1:
Вам нужно перебирать каждое слово, как вы сказали, и для каждого слова определять его оценку. Затем вам нужно сохранить оценку этого слова и само слово или позицию этого слова. Если следующий результат, который вы вычисляете, имеет больший результат, чем тот, который вы сохранили, перезапишите — в противном случае перейдите к следующей итерации. Наконец, верните значение.
Используйте strtolower()
, чтобы убедиться, что слова написаны строчными буквами, иначе строка like A man with a XRAY
не будет найдена XRAY
как слово с наибольшим значением.
function high($input) {
// Initialize: Convert the string to lowercase, and generate an array of the alphabet
$input = strtolower($input);
$alphabet = range('a', 'z');
$values = array_flip($alphabet);
// Split the words into an array, and declare initial scores
$words = explode(" ", $input);
$highestScore = null;
$highestIndex = null;
// Iterate over each word
foreach($words as $k=>$w) {
// Calculate the score of the current word
// The score is the position of the flipped alphabet array, or 0 if its not in the lsit
$score = array_sum(array_map(function($v) use ($values) {
return $values[$v] ?? 0;
}, str_split($w)));
// If the current score is higher than the previous highest, overwrite it
if ($highestScore < $score) {
$highestScore = $score;
$highestIndex = $k;
}
}
// Return the word at the index where the score was the highest
// If there were no scores (if $input is empty), return a default message
return $words[$highestIndex] ?? 'N/A - No words found';
}
array_map()
Функция вернет массив всех отдельных значений этого слова (каждой буквы), поэтому мы используем array_sum()
для получения полной суммы массива.
Поскольку мы используем return $values[$v] ?? 0;
и только создаем значения a-z
, любые другие символы будут иметь оценку 0. Поскольку строка преобразуется в нижний регистр, это означает, что она будет обрабатывать a
и A
с тем же счетом 1. Специальные символы, такие как !?#
и так далее, получат оценку 0.
- Живая демонстрация на https://3v4l.org/4ESFG
Ответ №2:
Поскольку на самом деле вас не волнует оценка, скорее слово с самыми старшими символами, вы можете использовать ord()
для вычисления значения ascii. Здесь алфавит находится в порядке возрастания и поэтому дает более высокое значение, но оно все еще зависит от позиции.
Это разбивает слова, затем для каждого слова добавляет значение ascii и отслеживает самое высокое…
function high($x) {
// Split sentence into words (lower cased)
$words = explode(" ", strtolower($x));
$max = 0;
$maxWord = '';
foreach($words as $w) {
// Keep track of 'value' of word
$value = 0;
// For each letter of the word ($i)...
for ( $i = 0, $len = strlen($w); $i < $len; $i ) {
// $w[$i] is the letter we are dealing with (treat a string as an array)
// Take the ascii value of this character and adjust it by 'a'
$value = (ord($w[$i]) -ord('a'));
}
// Check if the new highest value
if ( $value > $max ) {
$max = $value;
$maxWord = $w;
}
}
return $maxWord;
}
Комментарии:
1. Довольно умно использовать
ord()
функцию, не подумал об этом.2. Очень хорошее решение, но, похоже, оно не работает? «Не удалось подтвердить, что две строки равны. Ожидаемое: «вулкан» Фактическое: «восхождение»» Может быть, это ошибка? Я почти уверен, что значение volcano выше.
3. «во сколько мы поднимаемся на вулкан »
4. Я обновил цикл и изменил его на
(ord($w[$i]) -ord('a'));
.5. Можете ли вы попытаться объяснить это подробнее? Я чувствую себя таким глупым, потому что сейчас получаю это сразу:(