Поиск слова с наибольшим количеством баллов в строке на основе значения буквы?

#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.

Ответ №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. Можете ли вы попытаться объяснить это подробнее? Я чувствую себя таким глупым, потому что сейчас получаю это сразу:(