Очень интересная задача на Хакерранке, которая называется Веселая строка.
Проблема:
В этом задании вы определите, забавная строка или нет. Чтобы определить, является ли строка забавной, создайте копию строки в обратном порядке, например.
abc-› cba. Перебирая каждую строку, сравните абсолютную разницу в значениях ascii символов в позициях 0 и 1, 1 и 2 и так далее до конца. Если список абсолютных различий одинаков для обеих строк, они забавны.
Определить, является ли строка Give забавной. Если это так, верните Funny
, иначе верните Not Funny
.
Например, для строки s="lmnop" порядковые значения символов равны [108,109,110,111,112] sReverse="ponml", а порядковые номера - [112,111,110,109,108]. Абсолютная разница соседних элементов для обеих строк равна [1,1,1,1], поэтому ответ равен Funny
.
Выполните функцию funnyString в редакторе ниже. Для каждого теста он должен возвращать строку Funny
или Not Funny
.
Мое решение Javascript для этой проблемы:
function funnyString(s) { let n = s.split(‘’); let r = n.slice().reverse(); let j = 1; for(let i = 1; i < n.length; i++){ if(Math.abs(n[i].charCodeAt() — n[i-1].charCodeAt()) === Math.abs(r[i].charCodeAt() — r[i-1].charCodeAt())){ j++; } } return j === n.length ? “Funny” : “Not Funny” }
Вот как я это сделал:
1. Чтобы использовать методы массива, я сделал массив из введенной строки, назвал его «n».
2. Затем я сделал перевернутый массив из «n», используя метод reverse(). Первоначально этот метод будет изменять массив «n»:
let n = s.split() -----> n = ["e","x","a","m","p","l","e"] let r = n.reverse() ---> r = ["e","l","p","m","a","x","e"] and n = ["e","l","p","m","a","x","e"]
Чтобы получить совершенно новый перевернутый массив, я использовал метод slice(). Он создает копию массива «n», а затем метод reverse() изменяет его:
let n = s.split() ---> n = ["e","x","a","m","p","l","e"] let r = n.slice().reverse() ---> r = ["e","l","p","m","a","x","e"] and n = ["e","x","a","m","p","l","e"]
3. Затем я зацикливаю массив «n», чтобы сверить текущий элемент с предыдущим, начиная с элемента с индексом «1»:
n[1] compared to n[0], n[2] compared to n[1] and so on.
4. В условии сказано, что я должен сравнить asciiзначения символов заданной и перевернутой строк. Вот почему я использовал метод charCodeAt():
Этот метод возвращает целое число от 0
до 65535
, представляющее кодовую единицу UTF-16 по заданному индексу. Именно то, что нам нужно для преобразования строковых символов в числа ASCII.
5. Также условием было сравнение абсолютной разницы в ascii значениях символов, поэтому я использовал метод Math.abs().
Функция Math.abs() в JavaScript используется для возврата абсолютного значения числа. Он принимает число в качестве параметра и возвращает его абсолютное значение:
Math.abs(-4) ---> 4 if(Math.abs(n[i].charCodeAt() — n[i-1].charCodeAt()) === Math.abs(r[i].charCodeAt() — r[i-1].charCodeAt())){ -----> Math.abs(110 -109) === Math.abs(109-110) -----> 1 === 1 -----> true -----> j++
6. Если абсолютная разность значений ascii n элементов равна r элементам, мы будем увеличивать «j», которому для нашего удобства присваивается значение «1».
7. И затем функция возвращает Забавно в случае, если каждое условие было правдивым и j увеличивалось каждый раз, когда я проверял, одинакова ли разница значений элементов ascii, другая Функцияways возвращает Не смешно
Спасибо, надеюсь, вам понравилось мое решение :)