Друзья, пишите свои решения в комментариях! Чем больше будет таких решений и чем они будут разнообразнее, тем больше пользы они принесут всем, тем успешнее будут наши собеседования!
Можно переписать второе решение через два указателя: function palindrome(str = '') { let left = 0; let right = str ? str.length - 1 : 0; while (left < right) { if (str[left] !== str[right]) { return false; } left++; right--; } return true; } А ещё можно было бы упомянуть про сложность алгоритмов, про big-O. Да в целом эти алгоритмы имеют вычислительную сложность O(n), но если уточнить, то в первом примере, если опустить преобразование к нижнему регистру и удаление пробелов, мы имеем лишние обходы строки/массива и лишнюю память. Снача split разбивает строку в массив, и при этом выделяется дополнительная память под этот массив. Reverse обходит массив, но за n/2 операций, так как меняет элементы местами через два указателя, и мутирует, по-этому память не изменяется. И join также проходится по всему массиву, собирает всё в строку и выделят под неё дополнительную память. Итого по сути у нас O(n + n/2 + n) и лишний массив со строкой в памяти. А второй вариант не расходует дополнительную память и имеет сложность O(n/2)
Тоже отличное решение с указателями! Да решение через один цикл - работает быстрее и с меньшим количеством памяти. Решение через методы строки и массивов - удобочитаемое. Какое выбрать - вопрос каждой конкретной ситуации. На собеседовании можно рассказать про оба и объяснить сильные/слабые стороны каждого из них. ЗЫ: про сложность алгоритма на собеседовании тоже можно рассказать - добавить дополнительных очков.
Кроме того второй вариант (или твой с указателями) значительно проще портируется на другие языки, поскольку использует только базовые конструкции, которые есть практически в любом языке, а не встроенные методы JS, которых во многих языках нет и которые придётся писать дополнительно. Но для полноты картины всё же надо добавить проверку на символы пробела, табуляции, переноса строки и знаки препинания, чтобы проверять сложные палиндромы.
На собеседованиях ещё гуляет такая задача: определить, являются ли строки анаграммами (когда две строки содержат одинаковый набор символов (учитываются только буквы!)). Вот моё решение: Сначала обе строки разбиваем на массивы, сортируем их, а затем отсортированные последовательности снова собираем в строки. Если обе строки оказались одинаковыми (а они окажутся одинаковыми, если набор символов был один и тот же в обеих строках), то можно сделать вывод, что строки являются анаграммами. Вот мой код: function sortString(str){ //переводим все буквы в нижний регистр str = str.toLowerCase(); //превращаем строку в массив let arr = str.split(''); //создаём регулярное выражение, которое пропускает только символы let rgxp = new RegExp(/^[a-zа-яё]/); //удаляем из массива все элеметны, которые не являются символами (буквами) for(let i = 0; i < arr.length; i++){ if(!rgxp.test(arr[i])){ delete arr[i]; } } //создаём массив, в котором будет храниться его отсортированная копия let res = []; //сортируем массив for(let i = 0; i < arr.length; i++){ for(let j = 0; j < arr.length; j++){ if(arr[i] < arr[j]) { let v = arr[i]; arr[i] = arr[j]; arr[j] = v; } } } //возвращаем результат уже в виде строки return arr.join(''); } //создаём две строки, наполненные одинаковыми символами let str1 = 'Hello wrldo!'; let str2 = 'Ole!hl drlow'; // let strA = sortString(str1); let strB = sortString(str2); //выводим строки в консоль console.log(strA); console.log(strB); //сравниваем полученные строки console.log(strA == strB);
Хороший алгоритм! (И калассно что с комментариями/разъяснениями) Мы как раз уже сняли видео про эту задачу. Там есть еще варианты ее решения. Посмотрите: th-cam.com/video/YlxIvmrijmY/w-d-xo.html
Среди палиндромов есть, например, такой: const input = '«Ура!», - вопите, дети, повару!'; Чтобы и на него функция возвращала true, предлагаю следующий вариант решения: const palindrome = str => { let directOrder = ''; let reverseOrder = ''; for (const char of str.toLowerCase()) { if (char !== char.toUpperCase()) { directOrder += char; reverseOrder = char + reverseOrder; } } return directOrder.length > 0 && directOrder === reverseOrder; };
Спасибо за видео. Вместо str.split('') можно еще сделать [...str] А насчет задачек - огромное их к-во есть на codewars любого уровня сложности и на любой вкус от очень простых типа полиндрома до разных криптографичеких методов, реально классная штука, только затягивает сильно))
За именования переменных не судите строго, у меня с этим проблемы function palindrome(str = '') { const strLowerCase = str.toLowerCase(); const strNoSpaces = strLowerCase.split(' ').join(''); const strNoSpacesReverse = strNoSpaces.split('').reverse().join(''); return strNoSpaces === strNoSpacesReverse; }
скажите а почему при сравнении елементов в цикле(первого и последнего) мы не убираем пробелы методом replace.Если сравнивать второй елемент и предпоследний то мы сравниваем пробел и букву.Поидеи должно выбить false.Но к моему удивлению выбило true на длинной фразе
Спасибо большое, я как раз готовлюсь, нравится ваша подача информации, приятно слушать! ещё рекурсией решают такую задачу, можно ли увидеть ваш вариант с рекурсией? Хотя бы в комментариях здесь, видео делать трудозатратное дело.. понимаю. Буду очень благодарен за подсказку в комментариях 😊
Вот вариант с рекурсией: function isPal(str) { if (str.length < 2) { return true; } else { if (str[0] === str[str.length-1]) { return isPal(str.substring(1,str.length-1)); } else { return false; } } } На каждой итерации проверяем самые крайние символы - если они одинаковы - откусываем их и оставшуюся строку опять скармливаем этой функции. Если символов останется 1 или 0 - то значит был палиндром.
А я вот на этой задаче завис.. Напишите функцию isPrime(n) для проверки, простое число n или нет. * Напомним, что число называют простым, если оно больше 1 и делится * без остатка только на 1 и на само себя. * * На вход функция должна принимать число n и возвращать true, * если n простое, и false - если нет.
@@frontendscience Вот такая, например «Сумма двух» * * Напишите функцию sumOfTwo(arr, num). Её аргументы: массив целых чисел arr * и целое число num. Функция должна вернуть true, если в переданном массиве * есть какие-то два числа, чья сумма равна num. Если же такой пары чисел нет, * функция должна вернуть false. * */ function sumOfTwo(arr, sum) { // Напишите код здесь } // Протестируйте решение, вызывая функцию с разными аргументами: console.log(sumOfTwo([1, 2, 3, 4, 5], 4)); // true (так как 1 + 3 === 4) console.log(sumOfTwo([1, 2, 3, 4, 5], 100)); // false
Так как я РегЕх не знаю, сделал все так же только вместо replace профилтровал массив на на пробелы split(' ').filter(char => char !== '').reverse().join(' ');
Это, конечно, полезная рубрика будет, но кроме рекурсии особо ничего не пригождалось из задач на собесах. Хз, почему собесы так отличаются от реальных проектов.
Бывают очень разнообразные собеседования. У каждой компании свой "стиль" собеседований. Я проходил много собеседований где был симбиоз синтетических задачек (не привязанных к реальной жизни, но про базовые структуры, алгоритмы) и реальных проектных заданий (считай прям как на реальном проекте компании).
Ребят, я новичок в JS, помогите, пожалуйста, решить задачку))) Буду очень благодарна!))) Она вроде бы легкая, но я запуталась)) Никак не пойму как это сделать((((( Нужно написать две функции *Первая функция number(num) должна принимать число и возвращать квадрат этого числа. *Вторая функция запрашивает у пользователя число от 18 до 50. И если пользователь ввёл не число, нужно сделать ему одно замечание, а если число, нужно вызвать функцию number передав в неё это самое число. Необходимо вывести результат пользователю либо замечание, либо квадрат числа.
@@ЮляИванова-у3щ нет. Prompt - делает диалоговое окно для ввода пользователем данных. Но эта функция всегда возвращает строку. Даже если пользователь ввел число, это будет строка с числом. Стобы его сделать действительно числом используется метод parseInt. Если в строке было число то вернется число, если строка содержала не число (например строку привет) то parseInt вернет NaN (not a number)
главное не забыть во втором способе тоже указать 'str = str.toLowerCase().replace(/\s/g, '')', чтобы в случае с пробелами и заглавными буквами получать правильный результат ))
Точно также как и в первом - если необходимо игнорировать регистр букв и пробелы то добавляем эту строку в начале функции str = str.toLowerCase().repalce(/\s/g,'');
@@smashno в тырнете можно найти много решений, например: function isPalindrome(str) { if (str.length < 2) return true; if (str[0] != str[str.length-1]) return false; return isPalindrome(str.substr(1, str.length-2)); }
привітик, до того як знайти ваше відео, я вже порішала з цифрами паліндроми і з строчкою. знайшла в гуглі строчку, яка має в собі тире і коми, тому створила окремий масив без символів - може це зайва робота, напишіть будь ласка якщо так. const isStrPalindrome = (string) => { const arr = string.split(""); const pureArr = []; arr.map((el) => /[a-zA-Z]/.test(el) && pureArr.push(el.toLowerCase())); for (let i = 0; i < arr.length; i++) { return pureArr[pureArr.length - i - 1] === pureArr[i]; } }; console.log(isStrPalindrome("A man, a plan, a canal - Panama")); PS: чи можуть задати на лавйкодінгу завдання написати клас чи об"єкт з методами?
Гарне рішення! Для такого вхідного рядка це вірна підготовка. Її можна трохи простіше зробити без додаткового масива. Можно використати replace, та вказати щоб видалились усі не букви. З приводу методів - так можуть задати, це дуже поширенний тип завдань.
Друзья, пишите свои решения в комментариях! Чем больше будет таких решений и чем они будут разнообразнее, тем больше пользы они принесут всем, тем успешнее будут наши собеседования!
Можно переписать второе решение через два указателя:
function palindrome(str = '') {
let left = 0;
let right = str ? str.length - 1 : 0;
while (left < right) {
if (str[left] !== str[right]) {
return false;
}
left++;
right--;
}
return true;
}
А ещё можно было бы упомянуть про сложность алгоритмов, про big-O. Да в целом эти алгоритмы имеют вычислительную сложность O(n), но если уточнить, то в первом примере, если опустить преобразование к нижнему регистру и удаление пробелов, мы имеем лишние обходы строки/массива и лишнюю память. Снача split разбивает строку в массив, и при этом выделяется дополнительная память под этот массив. Reverse обходит массив, но за n/2 операций, так как меняет элементы местами через два указателя, и мутирует, по-этому память не изменяется. И join также проходится по всему массиву, собирает всё в строку и выделят под неё дополнительную память. Итого по сути у нас O(n + n/2 + n) и лишний массив со строкой в памяти. А второй вариант не расходует дополнительную память и имеет сложность O(n/2)
Тоже отличное решение с указателями! Да решение через один цикл - работает быстрее и с меньшим количеством памяти. Решение через методы строки и массивов - удобочитаемое. Какое выбрать - вопрос каждой конкретной ситуации. На собеседовании можно рассказать про оба и объяснить сильные/слабые стороны каждого из них. ЗЫ: про сложность алгоритма на собеседовании тоже можно рассказать - добавить дополнительных очков.
Ага, так тоже сгодится, Саш. Интересно, какие еще решения найдут наши подписчики!)
Кроме того второй вариант (или твой с указателями) значительно проще портируется на другие языки, поскольку использует только базовые конструкции, которые есть практически в любом языке, а не встроенные методы JS, которых во многих языках нет и которые придётся писать дополнительно.
Но для полноты картины всё же надо добавить проверку на символы пробела, табуляции, переноса строки и знаки препинания, чтобы проверять сложные палиндромы.
так 2 решение тоже через указатели работают
На собеседованиях ещё гуляет такая задача: определить, являются ли строки анаграммами (когда две строки содержат одинаковый набор символов (учитываются только буквы!)).
Вот моё решение:
Сначала обе строки разбиваем на массивы, сортируем их, а затем отсортированные последовательности снова собираем в строки. Если обе строки оказались одинаковыми (а они окажутся одинаковыми, если набор символов был один и тот же в обеих строках), то можно сделать вывод, что строки являются анаграммами.
Вот мой код:
function sortString(str){
//переводим все буквы в нижний регистр
str = str.toLowerCase();
//превращаем строку в массив
let arr = str.split('');
//создаём регулярное выражение, которое пропускает только символы
let rgxp = new RegExp(/^[a-zа-яё]/);
//удаляем из массива все элеметны, которые не являются символами (буквами)
for(let i = 0; i < arr.length; i++){
if(!rgxp.test(arr[i])){
delete arr[i];
}
}
//создаём массив, в котором будет храниться его отсортированная копия
let res = [];
//сортируем массив
for(let i = 0; i < arr.length; i++){
for(let j = 0; j < arr.length; j++){
if(arr[i] < arr[j]) {
let v = arr[i];
arr[i] = arr[j];
arr[j] = v;
}
}
}
//возвращаем результат уже в виде строки
return arr.join('');
}
//создаём две строки, наполненные одинаковыми символами
let str1 = 'Hello wrldo!';
let str2 = 'Ole!hl drlow';
//
let strA = sortString(str1);
let strB = sortString(str2);
//выводим строки в консоль
console.log(strA);
console.log(strB);
//сравниваем полученные строки
console.log(strA == strB);
Хороший алгоритм! (И калассно что с комментариями/разъяснениями) Мы как раз уже сняли видео про эту задачу. Там есть еще варианты ее решения. Посмотрите: th-cam.com/video/YlxIvmrijmY/w-d-xo.html
function anagrams(a, b) {
return b.filter(w=>''+[...a].sort()===''+[...w].sort());
}
@@АнастасияДанилюк-я7л правая часть в условии функции фильтра разве не будет одну букву выводить? я бы скорее использовал includes.
Среди палиндромов есть, например, такой:
const input = '«Ура!», - вопите, дети, повару!';
Чтобы и на него функция возвращала true, предлагаю следующий вариант решения:
const palindrome = str => {
let directOrder = '';
let reverseOrder = '';
for (const char of str.toLowerCase()) {
if (char !== char.toUpperCase()) {
directOrder += char;
reverseOrder = char + reverseOrder;
}
}
return directOrder.length > 0
&& directOrder === reverseOrder;
};
Спасибо за видео.
Вместо str.split('') можно еще сделать [...str]
А насчет задачек - огромное их к-во есть на codewars любого уровня сложности и на любой вкус от очень простых типа полиндрома до разных криптографичеких методов, реально классная штука, только затягивает сильно))
Спасибо, изначально думал о втором варианте, а первый всё-таки красивее) Беру в копилку эту задачку)
Рад, что было полезно
function isPalindrome(str){
if(str.length === 1) return true;
if(str.length === 2) return str[0] === str[1];
if(str[0] === str.slice(-1)) return isPalindrome(str.slice(1,-1))
return false;
}
Класс! Благодарю за решение. Рекурсивного варианта еще не было )
За именования переменных не судите строго, у меня с этим проблемы
function palindrome(str = '') {
const strLowerCase = str.toLowerCase();
const strNoSpaces = strLowerCase.split(' ').join('');
const strNoSpacesReverse = strNoSpaces.split('').reverse().join('');
return strNoSpaces === strNoSpacesReverse;
}
скажите а почему при сравнении елементов в цикле(первого и последнего) мы не убираем пробелы методом replace.Если сравнивать второй елемент и предпоследний то мы сравниваем пробел и букву.Поидеи должно выбить false.Но к моему удивлению выбило true на длинной фразе
Спасибо! Пригодится
Это хорошо!
спасибо
какой ты красава
Вместо \S я бы использовал \W, дабы исключить запятые и прочее.
Да, хорошее предложение!
Спасибо большое, я как раз готовлюсь, нравится ваша подача информации, приятно слушать! ещё рекурсией решают такую задачу, можно ли увидеть ваш вариант с рекурсией? Хотя бы в комментариях здесь, видео делать трудозатратное дело.. понимаю. Буду очень благодарен за подсказку в комментариях 😊
Вот вариант с рекурсией:
function isPal(str) {
if (str.length < 2) {
return true;
} else {
if (str[0] === str[str.length-1]) {
return isPal(str.substring(1,str.length-1));
} else {
return false;
}
}
}
На каждой итерации проверяем самые крайние символы - если они одинаковы - откусываем их и оставшуюся строку опять скармливаем этой функции. Если символов останется 1 или 0 - то значит был палиндром.
А как на счет нахождения подстроки в строке, которая является палиндромом? :)
Например 4512332167 не палиндром, но его часть 123321 - палиндром.
Классная задача! Добавили в список на съемку.
well done!
Позволю себе пофлудить. Сорян если задел чьи то чувства,
Решение короткое на Java:
public class Palindrom_sentence {
public static void main(String[] args) {
String str1 = "А роза упала на лапу Азора";
String str2 = "aboba1";
System.out.println(isPalindrom(str1));
}
private static boolean isPalindrom(String str) {
return str.equals(new StringBuilder(str.toLowerCase().replaceAll("\\s", "")).reverse().toString());
} }
День добрый! Спасибо большое за урок. У меня вопрос, а второй вариант разве решает проблему с пробелами? Чеивертая строка выдаст true?
Подготовку строки я уже не стал включать во второй пример. Можете скопировать эту строчку из первого примера, если необходимо.
Во втором примере решения "Анна" и "А роза упала на лапу Азора" вернёт false
Дякую
А я вот на этой задаче завис..
Напишите функцию isPrime(n) для проверки, простое число n или нет.
* Напомним, что число называют простым, если оно больше 1 и делится
* без остатка только на 1 и на само себя.
*
* На вход функция должна принимать число n и возвращать true,
* если n простое, и false - если нет.
Отличная задача, спасибо за идею! Запишем!
@@frontendscience по ходу, могу потихоньку покидывать ещё по возврастанию 😉
Variag C да, да, супер, присылайте!
@@frontendscience
Когда будете выводить в консоль, сделайте проверку на цифру 2.
@@frontendscience Вот такая, например «Сумма двух»
*
* Напишите функцию sumOfTwo(arr, num). Её аргументы: массив целых чисел arr
* и целое число num. Функция должна вернуть true, если в переданном массиве
* есть какие-то два числа, чья сумма равна num. Если же такой пары чисел нет,
* функция должна вернуть false.
*
*/
function sumOfTwo(arr, sum) {
// Напишите код здесь
}
// Протестируйте решение, вызывая функцию с разными аргументами:
console.log(sumOfTwo([1, 2, 3, 4, 5], 4)); // true (так как 1 + 3 === 4)
console.log(sumOfTwo([1, 2, 3, 4, 5], 100)); // false
Е эл ба тэ , ага))
f4.bcbits.com/img/a1711455071_5.jpg
Мои решения (про регулярку я забыл):
function palindrome(string) {
const str = string.split('').filter((el) => el !== ' ').join().toLowerCase();
return str === str.split('').reverse().join('');
}
function palindrome(string) {
const str = string
.split('').filter((el) => el !== ' ').join().toLowerCase();
const arr = str.split('');
let len = arr.length - 1;
for (let i = 0; i < str.length; i += 1) {
if (str[i] !== str[len - i]) return false;
}
return true;
}
Так как я РегЕх не знаю, сделал все так же только вместо replace профилтровал массив на на пробелы split(' ').filter(char => char !== '').reverse().join(' ');
да, мне на собеседованиях такой вариант часто писали
👌🙈🤗👌🙃
Это, конечно, полезная рубрика будет, но кроме рекурсии особо ничего не пригождалось из задач на собесах. Хз, почему собесы так отличаются от реальных проектов.
Бывают очень разнообразные собеседования. У каждой компании свой "стиль" собеседований. Я проходил много собеседований где был симбиоз синтетических задачек (не привязанных к реальной жизни, но про базовые структуры, алгоритмы) и реальных проектных заданий (считай прям как на реальном проекте компании).
Ребят, я новичок в JS, помогите, пожалуйста, решить задачку))) Буду очень благодарна!))) Она вроде бы легкая, но я запуталась)) Никак не пойму как это сделать(((((
Нужно написать две функции
*Первая функция number(num) должна принимать число и возвращать квадрат этого числа.
*Вторая функция запрашивает у пользователя число от 18 до 50.
И если пользователь ввёл не число, нужно сделать ему одно замечание, а если число, нужно вызвать функцию number передав в неё это самое число. Необходимо вывести результат пользователю либо замечание, либо квадрат числа.
Держи
codepen.io/puzankov/pen/JjWVjNx?editors=0011
@@frontendscience Огромное Вам спасибо!)
Извините, пожалуйста, что снова беспокою Вас(
А parseInt() используется для того чтобы принять строку в качестве аргумента и вернуть целое число?
@@ЮляИванова-у3щ нет. Prompt - делает диалоговое окно для ввода пользователем данных. Но эта функция всегда возвращает строку. Даже если пользователь ввел число, это будет строка с числом. Стобы его сделать действительно числом используется метод parseInt. Если в строке было число то вернется число, если строка содержала не число (например строку привет) то parseInt вернет NaN (not a number)
@@frontendscience я поняла, спасибо большое, что объяснили))
главное не забыть во втором способе тоже указать 'str = str.toLowerCase().replace(/\s/g, '')', чтобы в случае с пробелами и заглавными буквами получать правильный результат ))
Да, да :)
Во втором решении, а как быть с пробелами?
Точно также как и в первом - если необходимо игнорировать регистр букв и пробелы то добавляем эту строку в начале функции str = str.toLowerCase().repalce(/\s/g,'');
Почему пишем Math.floor? Только это не понял. Спасибо
s = 'abcba' a.length = 5, Math.floor(a/2) = 2. 2й элемент это "c"так как нумерация начинается с 0
Рекурсивное решение палиндрома приветствуется на собесе.
А как его решить через рекурсию? Покажешь решение?
@@smashno в тырнете можно найти много решений, например:
function isPalindrome(str) {
if (str.length < 2) return true;
if (str[0] != str[str.length-1]) return false;
return isPalindrome(str.substr(1, str.length-2));
}
Интересно, почему редактор кода не заругался на "replce" )
Может из вежливости)
@@frontendscience намек понял, прошу прощения.
@@eugeneromanenko5960 ))))
очень устал)
все ето не то вот попробуй с етой строки сделать палиндром uguutu - ответ: uguutuugu или вот abcded - ответ: abcdedcba - такое сможеш?
привітик, до того як знайти ваше відео, я вже порішала з цифрами паліндроми і з строчкою. знайшла в гуглі строчку, яка має в собі тире і коми, тому створила окремий масив без символів - може це зайва робота, напишіть будь ласка якщо так.
const isStrPalindrome = (string) => {
const arr = string.split("");
const pureArr = [];
arr.map((el) => /[a-zA-Z]/.test(el) && pureArr.push(el.toLowerCase()));
for (let i = 0; i < arr.length; i++) {
return pureArr[pureArr.length - i - 1] === pureArr[i];
}
};
console.log(isStrPalindrome("A man, a plan, a canal - Panama"));
PS: чи можуть задати на лавйкодінгу завдання написати клас чи об"єкт з методами?
Гарне рішення! Для такого вхідного рядка це вірна підготовка. Її можна трохи простіше зробити без додаткового масива. Можно використати replace, та вказати щоб видалились усі не букви.
З приводу методів - так можуть задати, це дуже поширенний тип завдань.
@@frontendscience дуже дякую)
👌🙈🤗👌🙃