Вопросы, вопросы, вопросы

Снова вернемся к 7-му посту из серии интервью по javascript. Я наткнулся на эту задачу в другом блоге, но решения, опубликованные там, были на python и java, поэтому я решил попробовать ее на javascript. Это было тяжело, и в какой-то момент я немного запутался. Признаюсь, мне пришлось подсмотреть решение на coderbyte. Когда все это было проработано, я подумал, что было бы неплохо включить его в эту серию. Итак, давайте начнем.

Задача: написать функцию, которая принимает строку. Строка может содержать любую комбинацию букв и цифр. Если два последовательных числа в сумме дают 10, проверьте, есть ли в этой строке три вопросительных знака (?), и если да, верните true.

На этот раз мы просто рассмотрим одно решение, но вы должны бросить себе вызов и придумать другое. Это решение будет включать в себя пару циклов и пару уже знакомых методов. Хорошо пойдем:

Сначала давайте установим некоторые тестовые переменные и то, что мы ожидаем, что они вернут.

В случае 1 первое число в строке равно 6, затем 4, что соответствует нашему условию 10, поэтому мы хотим посмотреть между ними. Поскольку между ними 3 знака ?, функция должна возвращать значение true. То же самое относится и к case2, но case3 и case4 должны завершаться ошибкой и возвращать false. Приступим к коду…

Для начала давайте определим пару переменных. Во-первых, arr будет пустым массивом, который мы будем использовать всего через минуту, затем будет возвращено ans, и мы установим значение по умолчанию для него как false. Далее у нас есть первый цикл for. Этот цикл будет проверять каждый символ во входной строке, и если это число, то он добавит позицию индекса в наш новый массив. Теперь петля №2…

Хорошо, это начинает выглядеть немного непривычно, но давайте пройдемся по нему. Здесь мы смотрим на символ в нашей входной строке в первой позиции индекса, которая была добавлена ​​в наш массив (arr). Мы преобразуем это из строки в число, делаем то же самое с символом в следующей позиции индекса, которую мы добавили в наш массив, и складываем их вместе. Если они равны 10, мы используем эти позиции индекса с помощью метода .slice(), чтобы вернуть строку, которая находится между этими двумя числами, и установить ее в переменную subStr. Вау! Хорошо, теперь у нас есть строка всех символов между нашими двумя числами, что нам с ней делать?

Я признаю, что здесь я искал другой путь, используя пару методов, которые мы использовали раньше, но это выглядело очень грязно. Поэтому я взглянул на решение, опубликованное на coderbyte, и понял, что так оно будет намного чище:

Этот способ использует метод .replace() и включает RegEx для перехода по одному символу subStr за раз. Оператор RegEx говорит, что если символ соответствует ? затем пропустите его и, если он не совпадает, замените его ничем (‘ ‘). Наконец, мы видим, равна ли наша новая подстрока (sub2) точно «???», и если это так, мы сбрасываем переменную ans в true. И вот!

Эта задача была сложной, но если разбить ее на более мелкие части, с ней будет легче справиться. Большой привет сайту coderbyte, это отличное место для практики и множества сложных задач на 11 разных языках. Какие еще есть способы решить эту задачу? Что, если числа, которые мы складываем вместе, не являются последовательными? Можете ли вы изменить эту функцию так, чтобы case3 возвращал true? Удачи там до следующего раза…