На этой неделе я собираюсь вернуться к более простым временам, которые напоминают мне о пиве, которое мы с мужем пили в Trader Joe's, и написать о проблеме со строками, которую я решил для задания по программированию на Hackerrank.

Проблема

Инструкции заключались в том, чтобы написать функцию, которая принимает строку, поворачивает ее общее число раз, равное числу, меньшему, чем длина строки, а затем возвращает количество результирующих строк, начинающихся и заканчивающихся одной и той же буквой. Первая строка является входной строкой, а затем функция формирует дополнительные строки, перемещая первую букву ввода в ее конец. Например, если входной строкой является «abgha», эта строка циклически переворачивается четыре раза, чтобы получить результирующие строки: «bghaa», «ghaab», «haabg» и «aabgh». Возвращаемое значение будет равно 1, потому что только исходная строка начинается и заканчивается одной и той же буквой.

Мое решение

Ниже мое решение; Я не уверен, проходит ли он все крайние случаи, но, похоже, он работает, когда я тестирую его в своем терминале. Первое условие может различаться в зависимости от того, как вы хотите обрабатывать входные строки длиной 0 или 1. Я указал, что в этих случаях функция должна возвращать 1. Моей причиной этого было то, что строка типа «a» имеет один и тот же первый и последний символ. Строка «» на самом деле не содержит никаких символов, поэтому то, что вы хотели бы вернуть в этой ситуации, может быть более спорным. Как и многие другие вещи в жизни, это зависит от контекста и зависит от того, чего вы пытаетесь достичь, используя эту функцию. И, как обычно, я не знаю, для чего на самом деле может быть полезна такая функция, кроме как для пыток — я имею в виду обучение — начинающих инженеров-программистов.

function countStrings(s) {
let lengthOfString = s.length;
if(lengthOfString === 1 || lengthOfString === 0){
return 1
}
else{
let i = 1;
let count = 0;
if(s[0]===s[lengthOfString-1]){
count+=1;
}
while (i < lengthOfString){
s= s.slice(1, lengthOfString)+s[0]
if(s[0]===s[lengthOfString-1]){
count+=1;
}
i++
}
return count;
}
}

Объяснение

В первом операторе if я обрабатываю случай, когда входные строки имеют длину 0 или 1. Если функция соответствует этому условию, она завершается, возвращая 1. В противном случае выполняется следующая часть функции в операторе else. Во-первых, я установил переменную count для суммирования количества строк, начинающихся и заканчивающихся одной и той же буквой. Затем функция просматривает входную строку; если он начинается и заканчивается одной и той же буквой, счет увеличивается на единицу. Затем выполняется цикл while, пока переменная i меньше длины входной строки. В цикле while дополнительные строки создаются с использованием метода slice, который вырезает часть s от позиции индекса 1 до конца строки, а затем добавляет символ в позиции индекса 0 в конец этого фрагмента. Новая строка переназначается как значение «s». Затем эта строка проверяется, чтобы увидеть, совпадают ли первый и последний символы. Если это так, счетчик увеличивается, и переменная i увеличивается. Цикл while выполняется снова, пока не будет выполнено условие выхода. В конце счетчик возвращается.

И это все, что нужно сделать. Хороших выходных!