Пройтись по алгоритму Javascript, эпизод 1

Я пишу этот блог, чтобы поделиться частью своего путешествия в веб-разработку. Хотя я нахожусь в той части, когда я все еще прохожу этап поиска работы, я хотел поделиться тем, как работать с чем-то, что вы не начнете слышать, пока не изучите тонкости языка… .. АЛГОРИТМЫ!

Алгоритм — это набор правил, которым необходимо следовать для решения задачи. Как человек, который в настоящее время постоянно изучает веб-разработку, я хочу также сосредоточиться на изучении синтаксиса, связанного с решением некоторых из этих проблем, поэтому мой выбор языка для решения этих алгоритмов будет построен с использованием javascript. УРА!??!??

Итак, давайте сначала обсудим проблему, а затем начнем составлять алгоритм ее решения.

Допустим, у нас есть строка, которую мы ищем… скажем, элемент…. "овощи". Одна проблема... строка, которую вы ищете, просто так оказалась окружена большим набором строк (или как... это строка внутри строки).

example: “llllllllllvegetableslllll”

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

example: "llllvlellglleltlalbllllesllll"

При написании компьютерных программ мы должны быть готовы справиться с такими вещами, когда нам нужно будет найти способ решить нашу проблему… или нам нужно что-то вычислить для нас. Здесь начинается написание алгоритма.

Хотя я не буду вдаваться в основы языка Javascript/ECMAScript, я предполагаю, что вы изучали javascript, но самое замечательное в алгоритмах то, что их можно написать на любом языке. Тот же самый процесс, который я могу написать на javascript, я также могу написать на Ruby, Python, C# и многих других языках.

Мы собираемся написать алгоритм, который возвращает строку «Найдено», если нам случится найти нашу строку внутри строки. Если он не находит строку, он возвращает строку «НЕТ». Итак, приступим к делу.

Это один из примеров алгоритма:

Давайте пройдемся по этому алгоритму…..

function findMyString(s) {
    
}

Первое, что мы делаем, это определяем нашу функцию в строке 1. Мы называем эту функцию «findMyString». Функция имеет параметр «s», именно здесь мы собираемся передать аргумент строки, которую нам нужно перебрать после вызова нашей функции.

    const word = 'vegetables';
    let [foundAt, next] = [0, 0];
   

Второе, что мы хотим сделать, это установить переменную, которая установлена ​​на строку, которую мы будем искать. В случае задачи, которую нужно решить, ищем строку «овощи». Затем мы также устанавливаем 2 переменные посредством деструктурирования, называемые «foundAt» и «next».

Переменная «foundAt» будет установлена ​​на 0, она будет содержать значение индекса для буквы, которую мы ищем.

Переменная «следующая» будет установлена ​​как индекс буквы, которую нам нужно искать для продвижения вперед / перехода справа от каждой буквы в строке. Для этого будет установлено значение 0, чтобы начать с начала строки, которую нам нужно найти.

    for (let w of word) {
        
    }
    

Теперь мы настроим цикл for. Этот цикл будет проходить и перебирать каждую букву строки, которую мы ищем. В случае этого алгоритма «w» будет представлять каждую букву «овощей» по мере выполнения нашего цикла.

    next = s.slice(foundAt).indexOf(w);
       

Теперь мы обновим переменную «далее». Мы будем использовать метод slice для переменной «s», для которой задан аргумент, передаваемый при вызове функции. Мы передали строку «lllllvlellglleltlalbllllesllll» при вызове, поэтому «s» теперь установлено на это. Мы собираемся срезать, начиная с первой буквы в строке или с индекса 0 (то, чем был инициализирован «foundAt»). Поскольку мы разрезаем по индексу 0, на самом деле это будет вся строка из-за того, как метод разрезает.

Затем мы используем метод indexOf, чтобы найти, где в нарезанной строке находится искомая буква. Поскольку «w» оценивается как первая буква слова «овощи», весь этот оператор в значительной степени говорит о том, что «следующий» указывает на индекс буквы «v» в строке «lllllvlellglleltlalbllllesllll». Учитывая эту строку, «следующий» будет установлен на 4.

Если букву «v» в строке найти не удалось, то метод indexOf фактически вернет -1.

   if (next === - 1) return 'NO';

Именно здесь мы можем получить первый возврат, чтобы завершить наш алгоритм. Если бы «далее» оценивалось как -1, мы бы получили ответ «НЕТ», что означает, что буква «v» в строке «овощи» не может быть найдена. Если бы мы вызвали нашу функцию и передали строку «lllllellglleltlalbllllesllll», «next» было бы равно -1 на первой итерации нашего цикла for, который затем вернул бы «NO» (потому что буква «v» не может быть найдена ). Наш алгоритм всегда будет возвращать «НЕТ», если он не может найти текущую букву, которую ищет в строке.

        foundAt += next + 1;
    }
    return 'Found';
}

Однако, если мы нашли, где будет встречаться следующая буква, мы изменим переменную «foundAt», чтобы запустить нашу проверку следующей буквы, которая нам нужна в цикле, по строке, переданной в качестве аргумента («s»).

Причина, по которой мы добавляем 1 к следующему, заключается в том, что он может разрезать / оценивать строку, начиная с того места, где мы нашли нашу последнюю букву. Итак, если мы нашли букву «v» в строке «llllvlellglleltlalbllllesllll», «foundAt будет установлен на индекс после буквы «v» (5, которая представляет индекс «l»). Поскольку «foundAt» имеет значение 5, теперь мы будем искать только часть после «v» для нашей следующей буквы «e».

Цикл for будет продолжать выполняться через каждую букву слова «овощи». Пока следующая буква будет найдена после каждой итерации, функция будет возвращать «Найдено» ТОЛЬКО, если каждая буква действительно найдена.

Это всего лишь моя первая попытка объяснить алгоритм и показать, как мы будем его решать. Я постараюсь найти больше примеров алгоритмов для решения и показать вам шаг за шагом, как можно работать с одним из них. Обратите внимание, что это только один из способов решения этой проблемы. Есть много других способов в зависимости от языка и синтаксического сахара, который вы хотите добавить в свой код. Я постараюсь отредактировать и сделать это более читаемым / понятным с течением времени.