[{"data":1,"prerenderedAt":1117},["ShallowReactive",2],{"$fHI3YEn4PhCBr4FhIt3b0ffeQXZg_erZoJ9uDw1PwKyk":3,"$f-KhKwB8J0md5Q3U1oyqNCQbHxVpirjaanlJWCGo_ht4":88,"$fkVWEWXZHbLy86BhC78gDVDJ_00TY4k_DsdZD3Mz6ZO0":91,"$fqGwjmVbyPxmA5lnsLz9nF3m-ncS8WzLIlTsTA85cuZA":96,"$fVMSX_HWVzVkzv-u5ATHiOgClblPaIGZfXUn_Cq8LKn4":441,"$fw0tI3d-iV2W3zZtbRjyPNNRSgXGobrmwsMU7a1fynls":662,"mdc-5u0bwt-key":682,"mdc--v3k7jo-key":742,"mdc-5s6axn-key":759,"mdc--gs4hto-key":821,"mdc-s8h3np-key":838,"mdc-pgqsrr-key":918,"mdc-ae46aw-key":972,"mdc--6ck2cp-key":1063,"mdc-gzcye6-key":1079},{"content":4,"livecodingContent":54,"type":77,"pageMeta":78},[5,9,13,16,20,23,27,31,34,38,41,45,48,51],{"id":6,"value":7,"isTypeH1":8},"1987","Определить, является ли слово палиндромом",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4627","Теория","theory",{"id":14,"value":15,"isTypeParagraph":8},"10652","Палиндром — это строка, которая читается одинаково слева направо и справа налево. На практике в задачах по Web-разработке почти всегда требуется дополнительно определить “правила сравнения”: учитывать ли регистр, пробелы, дефисы, букву `ё` и т.д.",{"id":17,"value":18,"anchor":19,"isTypeH3":8},"4673","Приведение к единому виду (нормализация входа)","normalize-input",{"id":21,"value":22,"isTypeParagraph":8},"10653","Чтобы пример `isPalindrom(\"Ротор\") --> true` работал, сравнение должно выполняться без учёта регистра: `\"Ротор\"` и `\"ротор\"` должны стать одинаковыми. Для этого выполняется преобразование в нижний регистр через `toLowerCase()`.\n\nИногда требуется Unicode-нормализация: один и тот же видимый символ может быть представлен по-разному (как один кодовый пункт или как последовательность “базовый символ + комбинируемый знак”). Метод `normalize()` приводит строку к выбранной нормальной форме; практичным вариантом часто является `\"NFC\"`, так как он приводит к канонической композиции.",{"id":24,"description":25,"titleAlert":26,"isTypeAlertInfo":8},"712","Если входом строго является “слово” на кириллице без диакритики и экзотических символов, то `normalize(\"NFC\")` обычно не влияет на результат, но остаётся безопасной “страховкой” на будущее.",null,{"id":28,"value":29,"anchor":30,"isTypeH3":8},"4674","Сравнение симметричных позиций","compare-symmetric-positions",{"id":32,"value":33,"isTypeParagraph":8},"10654","У палиндрома всегда выполняется условие: символ на позиции `i` равен символу на позиции `len - 1 - i`.  \nИз этого следует две полезные идеи:\n- достаточно проверить только первую половину строки;\n- при первом несовпадении можно сразу вернуть `false` (ранний выход), не продолжая вычисления.\n\nНаглядная схема индексов для строки длины 5:\n\n```\nиндексы:  0   1   2   3   4\nсимволы:  a   b   c   b   a\nпары:    (0,4) (1,3) центр=2\n```\n\nДля чётной длины, например 6:\n\n```\nиндексы:  0   1   2   3   4   5\nсимволы:  a   b   c   c   b   a\nпары:    (0,5) (1,4) (2,3)\n```\n",{"id":35,"value":36,"anchor":37,"isTypeH3":8},"4675","Время и память (простыми словами)","time-and-memory",{"id":39,"value":40,"isTypeParagraph":8},"10655","Если строка длины `n`, то в вариантах B и C выполняется примерно `n/2` сравнений, но по принятой оценке сложности это O(n), потому что рост линейный. Память в этих вариантах O(1), так как не создаётся строка-«копия наоборот», сравнение происходит “на месте” по индексам.\n\nВариант A также имеет линейное время, но дополнительно создаёт структуру для разворота (`split` → массив, затем `reverse`, затем `join`), поэтому расход памяти выше.",{"id":42,"value":43,"anchor":44,"isTypeH2":8},"4628","Разбор крайних случаев","edge-cases",{"id":46,"value":47,"isTypeParagraph":8},"10656","Ниже перечислены ситуации, которые часто встречаются в реальном коде и помогают сделать функцию надёжнее.\n\n- Не строковый ввод: преобразование через `String(str)` позволяет избежать ошибок при значениях вроде `123`, `null`, `undefined` и всегда вернуть булево значение.\n- Пустая строка и строка из 1 символа: формально являются палиндромами, потому что читаются одинаково в обе стороны; при необходимости можно отдельно ввести правило “длина должна быть больше 1”.\n- Пробелы и знаки препинания: в данной формулировке задача про “слово”, поэтому фильтрация не требуется; для “фразового палиндрома” обычно добавляется удаление не-буквенно-цифровых символов и только затем выполняется сравнение.\n- Локаль и регистр: `toLocaleLowerCase()` может зависеть от локали, поэтому для предсказуемого результата чаще берётся `toLowerCase()`.\n\nПри необходимости реализации “палиндрома-фразы” может быть добавлен отдельный этап “очистки” строки (пример показан как дополнительный материал):\n\n```\nfunction isPalindromPhrase(str) {\n  const s = String(str)\n    .normalize(\"NFC\")\n    .toLowerCase()\n    .replace(/[^0-9a-zа-яё]/gi, \"\");\n\n  let left = 0;\n  let right = s.length - 1;\n\n  while (left \u003C right) {\n    if (s[left] !== s[right]) return false;\n    left++;\n    right--;\n  }\n\n  return true;\n}\n```",{"id":49,"description":50,"titleAlert":26,"isTypeAlertWarning":8},"780","Регулярное выражение для “очистки” зависит от требований: какие алфавиты поддерживаются, нужно ли сохранять `ё`, что делать с дефисом и т.д.; универсального варианта без уточнения правил не существует.",{"id":52,"value":53,"isTypeParagraph":8},"10657","Кратко: палиндром определяется сравнением симметричных символов `s[i]` и `s[len - 1 - i]`, причём достаточно пройти до середины строки. Для примера с `\"Ротор\"` требуется приведение к одному регистру, а для большей устойчивости к Unicode-особенностям полезно добавить `normalize(\"NFC\")`; самым практичным считается подход “два указателя” с O(n) по времени и O(1) по памяти.",{"id":55,"functionTestData":56,"functionName":73,"functionTemplateCode":74,"solution":75,"description":76},"428",[57,60,64,67,70],[58,8],[59],"казак",[61,63],[62],"строка",false,[65,8],[66],"шалаш",[68,8],[69],"Ротор",[71,63],[72],"Письмо","isPalindrom","function isPalindrom(str) {\n    // ваш код здесь\n}","**Вариант A** — простой и наглядный (через reverse)\n\nПодходит для первых шагов: строка приводится к нижнему регистру и сравнивается со своей перевёрнутой копией.\n\n```\nfunction isPalindrom(str) {\n  const s = String(str).toLowerCase();\n  return s === s.split(\"\").reverse().join(\"\");\n}\n```\n\n`split(\"\")` работает по 16-битным кодовым единицам UTF-16, поэтому для некоторых символов вне базовой плоскости Unicode (например, часть эмодзи) поведение может быть неожиданным; для “слов” на кириллице это обычно не проявляется.\n\n**Вариант B** — эффективнее по памяти (цикл до половины)\n\nСоздание перевёрнутой копии не требуется: достаточно сравнивать симметричные символы.\n\n```\nfunction isPalindrom(str) {\n  const s = String(str).toLowerCase();\n  for (let i = 0; i \u003C s.length / 2; i++) {\n    if (s[i] !== s[s.length - i - 1]) return false;\n  }\n  return true;\n}\n```\n\n**Вариант C** — “два указателя” + нормализация Unicode (самый устойчивый)\nВариант полезен, если в строке потенциально встречаются разные, но канонически эквивалентные представления символов (комбинируемые диакритические знаки и т.п.), тогда помогает `normalize(\"NFC\")` [web:9].  \nТакже регистр приводится через `toLowerCase()` (не через `toLocaleLowerCase()`), потому что `toLocaleLowerCase()` выполняет преобразование с учётом локали и в отдельных локалях (например, турецкой) может давать другой результат.\n\n```\nfunction isPalindrom(str) {\n  const s = String(str)\n    .normalize(\"NFC\")\n    .toLowerCase();\n\n  let left = 0;\n  let right = s.length - 1;\n\n  while (left \u003C right) {\n    if (s[left] !== s[right]) return false;\n    left++;\n    right--;\n  }\n  return true;\n}\n```\n\n`normalize(\"NFC\")` приводит строку к форме канонической композиции (NFC), что помогает сравнивать строки, которые визуально “одинаковы”, но записаны разными последовательностями кодовых точек.\n\nМини-таблица различий\n| Вариант | Идея | Время | Память | Когда выбирать |\n|---|---|---|---|---|\n| A | Сравнение с перевёрнутой строкой | O(n) | O(n) | Самое простое понимание |\n| B | Сравнение только половины | O(n) | O(1) | Быстрее и экономнее по памяти |\n| C | Два указателя + `normalize(\"NFC\")` | O(n) | O(1) | Когда важны нюансы Unicode и устойчивость |\n\nСама стратегия “два указателя” — классический подход: символы сравниваются с концов и указатели сходятся к центру, что даёт линейное время и константную память.","Палиндром — это слово, фраза или число, которое читается одинаково слева направо и справа налево. Например, слово \"шалаш\" или фраза \"А роза упала на лапу Азора\".\n\nДана функция: ```isPalindrom(str)```, которая аргументом принимает строку - слово и на выходе возвращает булевое значение, обозначающее, является ли слово палиндромом или нет. ```true```- палиндром, ```false```- не палиндром.\n\nПримеры:\n\n```\nisPalindrom(\"казак\") --> true,\nisPalindrom(\"строка\") --> false,\nisPalindrom(\"шалаш\") --> true,\nisPalindrom(\"Ротор\") --> true,\nisPalindrom(\"Письмо\") --> false,\n```","livecoding",{"title":7,"description":79,"ogTitle":7,"ogDescription":80,"ogImageUrl":81,"canonical":26,"ogLocale":82,"ogSiteName":83,"ogImageType":84,"ogImageWidth":85,"ogImageHeight":86,"ogType":87,"ogUrl":26},"isPalindrom('казак'); // true\nisPalindrom('строка'); // false\nisPalindrom('шалаш'); // true","isPalindrom('казак'); // true isPalindrom('строка'); // false isPalindrom('шалаш'); // true","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":89,"siteUrl":90},"GOOD WEB JOB!","https://goodwebjob.ru",[92],{"label":93,"slug":94,"to":95},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":97,"navigationSublist":105},[98,101],{"path":95,"isActive":63,"name":99,"icon":100,"isNavbarMobileDisabled":8},"С чего начать?","material-symbols:visibility-outline-rounded",{"path":102,"isActive":8,"name":103,"icon":104,"isNavbarMobileDisabled":63},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[106,115,142,154,160,300,324,333,339,402,423,429],{"title":107,"list":108,"isOpened":63},"Bash",[109,112],{"name":110,"path":111,"isActive":63},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":113,"path":114,"isActive":63},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":116,"list":117,"isOpened":63},"CSS",[118,121,124,127,130,133,136,139],{"name":119,"path":120,"isActive":63},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":122,"path":123,"isActive":63},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":125,"path":126,"isActive":63},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":128,"path":129,"isActive":63},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":131,"path":132,"isActive":63},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":134,"path":135,"isActive":63},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":137,"path":138,"isActive":63},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":140,"path":141,"isActive":63},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":143,"list":144,"isOpened":63},"Git",[145,148,151],{"name":146,"path":147,"isActive":63},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":149,"path":150,"isActive":63},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":152,"path":153,"isActive":63},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":155,"list":156,"isOpened":63},"HTML",[157],{"name":158,"path":159,"isActive":63},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":161,"list":162,"isOpened":63},"JavaScript",[163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,285,288,291,294,297],{"name":164,"path":165,"isActive":63},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":167,"path":168,"isActive":63},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":170,"path":171,"isActive":63},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":173,"path":174,"isActive":63},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":176,"path":177,"isActive":63},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":179,"path":180,"isActive":63},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":182,"path":183,"isActive":63},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":185,"path":186,"isActive":63},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":188,"path":189,"isActive":63},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":191,"path":192,"isActive":63},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":194,"path":195,"isActive":63},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":197,"path":198,"isActive":63},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":200,"path":201,"isActive":63},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":203,"path":204,"isActive":63},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":206,"path":207,"isActive":63},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":209,"path":210,"isActive":63},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":212,"path":213,"isActive":63},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":215,"path":216,"isActive":63},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":218,"path":219,"isActive":63},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":221,"path":222,"isActive":63},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":224,"path":225,"isActive":63},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":227,"path":228,"isActive":63},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":230,"path":231,"isActive":63},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":233,"path":234,"isActive":63},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":236,"path":237,"isActive":63},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":239,"path":240,"isActive":63},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":242,"path":243,"isActive":63},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":245,"path":246,"isActive":63},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":248,"path":249,"isActive":63},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":251,"path":252,"isActive":63},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":254,"path":255,"isActive":63},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":257,"path":258,"isActive":63},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":260,"path":261,"isActive":63},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":263,"path":264,"isActive":63},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":266,"path":267,"isActive":63},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":269,"path":270,"isActive":63},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":272,"path":273,"isActive":63}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":275,"path":276,"isActive":63},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":278,"path":279,"isActive":63},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":281,"path":282,"isActive":63},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":7,"path":284,"isActive":63},"/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":286,"path":287,"isActive":63},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":289,"path":290,"isActive":63},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":292,"path":293,"isActive":63},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":295,"path":296,"isActive":63},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":298,"path":299,"isActive":63},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":301,"list":302,"isOpened":63},"React",[303,306,309,312,315,318,321],{"name":304,"path":305,"isActive":63},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":307,"path":308,"isActive":63},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":310,"path":311,"isActive":63},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":313,"path":314,"isActive":63},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":316,"path":317,"isActive":63},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":319,"path":320,"isActive":63},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":322,"path":323,"isActive":63},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":325,"list":326,"isOpened":63},"Алгоритмы",[327,330],{"name":328,"path":329,"isActive":63},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":331,"path":332,"isActive":63},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":334,"list":335,"isOpened":63},"Дебаггинг",[336],{"name":337,"path":338,"isActive":63},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":340,"list":341,"isOpened":63},"Компьютерные сети",[342,345,348,351,354,357,360,363,366,369,372,375,378,381,384,387,390,393,396,399],{"name":343,"path":344,"isActive":63},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":346,"path":347,"isActive":63},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":349,"path":350,"isActive":63},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":352,"path":353,"isActive":63},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":355,"path":356,"isActive":63},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":358,"path":359,"isActive":63},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":361,"path":362,"isActive":63},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":364,"path":365,"isActive":63},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":367,"path":368,"isActive":63},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":370,"path":371,"isActive":63},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":373,"path":374,"isActive":63},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":376,"path":377,"isActive":63},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":379,"path":380,"isActive":63},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":382,"path":383,"isActive":63},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":385,"path":386,"isActive":63},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":388,"path":389,"isActive":63},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":391,"path":392,"isActive":63},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":394,"path":395,"isActive":63},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":397,"path":398,"isActive":63},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":400,"path":401,"isActive":63},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":403,"list":404,"isOpened":63},"Отрисовка в браузере",[405,408,411,414,417,420],{"name":406,"path":407,"isActive":63},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":409,"path":410,"isActive":63},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":412,"path":413,"isActive":63},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":415,"path":416,"isActive":63},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":418,"path":419,"isActive":63},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":421,"path":422,"isActive":63},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":424,"list":425,"isOpened":63},"Ревью кода",[426],{"name":427,"path":428,"isActive":63},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":430,"list":431,"isOpened":63},"Теория вероятности",[432,435,438],{"name":433,"path":434,"isActive":63},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":436,"path":437,"isActive":63},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":439,"path":440,"isActive":63},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"slugs":442},[443,446,448,450,452,455,458,460,462,464,466,468,471,473,475,477,479,481,483,485,487,489,491,493,495,497,499,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549,551,553,555,557,559,561,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593,595,597,599,601,603,605,607,609,611,613,615,617,619,621,623,625,627,629,631,633,635,637,639,641,643,645,647,649,651,652,654,656,658,660],{"name":444,"value":445},"Теоретические задания","theoretical-tasks",{"name":200,"value":447},"what-this-code-will-return-typeof-function",{"name":99,"value":449},"where-to-begin",{"name":167,"value":451},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":453,"value":454},"Backend","backend",{"name":456,"value":457},"Frontend","frontend",{"name":164,"value":459},"prototype-what-logical-values-will-be-received-in-console-log",{"name":281,"value":461},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":272,"value":463},"find-non-repeating-numbers-in-an-array",{"name":245,"value":465},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":251,"value":467},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":469,"value":470},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":257,"value":472},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":173,"value":474},"what-value-will-the-console-output-with-object-property",{"name":176,"value":476},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":248,"value":478},"returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":278,"value":480},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":7,"value":482},"determines-whether-a-word-is-a-palindrome",{"name":263,"value":484},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":289,"value":486},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":254,"value":488},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":260,"value":490},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":266,"value":492},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":298,"value":494},"the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":269,"value":496},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":275,"value":498},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":179,"value":500},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":182,"value":502},"there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":194,"value":504},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":197,"value":506},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":295,"value":508},"unifying-values-in-an-array",{"name":286,"value":510},"flattening-the-array",{"name":185,"value":512},"what-will-the-book-get-upper-name-method-return",{"name":292,"value":514},"string-compression",{"name":191,"value":516},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":203,"value":518},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":343,"value":520},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":349,"value":522},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":352,"value":524},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":355,"value":526},"key-differences-between-tcp-and-udp",{"name":358,"value":528},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":361,"value":530},"what-is-http-and-what-does-it-consist-of",{"name":364,"value":532},"what-are-http-headers-and-why-do-we-need-them",{"name":367,"value":534},"what-are-http-parameters",{"name":370,"value":536},"where-is-the-html-code-located-in-the-http-response-structure",{"name":158,"value":538},"what-is-html",{"name":373,"value":540},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":376,"value":542},"the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":379,"value":544},"what-is-a-cookie",{"name":382,"value":546},"who-initiates-the-cookie-recording-in-the-browser",{"name":385,"value":548},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":550,"value":77},"Лайвкодинг",{"name":170,"value":552},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":391,"value":554},"is-everything-that-goes-through-https-secure",{"name":394,"value":556},"all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":397,"value":558},"there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":409,"value":560},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":406,"value":562},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":412,"value":564},"what-is-blocking-the-page-rendering-in-the-browser",{"name":415,"value":566},"what-is-dom-in-a-browser-what-is-cssom",{"name":418,"value":568},"what-are-nodes-in-the-dom",{"name":421,"value":570},"what-does-cssom-consist-of",{"name":119,"value":572},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":122,"value":574},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":125,"value":576},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":128,"value":578},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":131,"value":580},"there-is-an-html-code-will-font-weight-affect-span",{"name":134,"value":582},"what-are-the-differences-between-flexbox-and-grid",{"name":137,"value":584},"do-flexbox-and-grid-replace-each-other",{"name":140,"value":586},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":103,"value":588},"tasks",{"name":206,"value":590},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":209,"value":592},"what-is-this-in-javascript",{"name":212,"value":594},"what-is-an-event-loop-and-how-does-it-work",{"name":215,"value":596},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":218,"value":598},"what-does-the-typeof-operator-show-in-javascript",{"name":221,"value":600},"what-types-of-data-exist-in-javascript",{"name":224,"value":602},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":227,"value":604},"what-will-typeof-return-for-an-array",{"name":230,"value":606},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":233,"value":608},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":236,"value":610},"what-does-typeof-return-for-new-set-in-javascript",{"name":304,"value":612},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":310,"value":614},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":313,"value":616},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":316,"value":618},"there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":319,"value":620},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":337,"value":622},"how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":146,"value":624},"developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":149,"value":626},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":152,"value":628},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":427,"value":630},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":110,"value":632},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":113,"value":634},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":328,"value":636},"what-is-algorithmic-complexity",{"name":331,"value":638},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":239,"value":640},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":400,"value":642},"how-can-a-user-be-authorized-on-a-website",{"name":242,"value":644},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":433,"value":646},"there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":436,"value":648},"there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":439,"value":650},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":93,"value":94},{"name":388,"value":653},"is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":346,"value":655},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":188,"value":657},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":307,"value":659},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":322,"value":661},"what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"cooperation":663,"copyright":666,"reportError":667,"socialNetwork":669},{"link":664,"title":665},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":668,"link":664},"Сообщить об ошибке",{"label":670,"socialNetworkList":671},"Мы в соцсетях:",[672,675,678],{"icon":26,"link":673,"title":674},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":676,"link":664,"title":677},"ic:baseline-telegram","Telegram",{"icon":679,"link":680,"title":681},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":683,"body":684},{},{"type":685,"children":686},"root",[687,695,725,730],{"type":688,"tag":689,"props":690,"children":691},"element","p",{},[692],{"type":693,"value":694},"text","Палиндром — это слово, фраза или число, которое читается одинаково слева направо и справа налево. Например, слово \"шалаш\" или фраза \"А роза упала на лапу Азора\".",{"type":688,"tag":689,"props":696,"children":697},{},[698,700,707,709,715,717,723],{"type":693,"value":699},"Дана функция: ",{"type":688,"tag":701,"props":702,"children":704},"code",{"className":703},[],[705],{"type":693,"value":706},"isPalindrom(str)",{"type":693,"value":708},", которая аргументом принимает строку - слово и на выходе возвращает булевое значение, обозначающее, является ли слово палиндромом или нет. ",{"type":688,"tag":701,"props":710,"children":712},{"className":711},[],[713],{"type":693,"value":714},"true",{"type":693,"value":716},"- палиндром, ",{"type":688,"tag":701,"props":718,"children":720},{"className":719},[],[721],{"type":693,"value":722},"false",{"type":693,"value":724},"- не палиндром.",{"type":688,"tag":689,"props":726,"children":727},{},[728],{"type":693,"value":729},"Примеры:",{"type":688,"tag":731,"props":732,"children":736},"pre",{"className":733,"code":735,"language":693},[734],"language-text","isPalindrom(\"казак\") --> true,\nisPalindrom(\"строка\") --> false,\nisPalindrom(\"шалаш\") --> true,\nisPalindrom(\"Ротор\") --> true,\nisPalindrom(\"Письмо\") --> false,\n",[737],{"type":688,"tag":701,"props":738,"children":740},{"__ignoreMap":739},"",[741],{"type":693,"value":735},{"data":743,"body":744},{},{"type":685,"children":745},[746],{"type":688,"tag":689,"props":747,"children":748},{},[749,751,757],{"type":693,"value":750},"Палиндром — это строка, которая читается одинаково слева направо и справа налево. На практике в задачах по Web-разработке почти всегда требуется дополнительно определить “правила сравнения”: учитывать ли регистр, пробелы, дефисы, букву ",{"type":688,"tag":701,"props":752,"children":754},{"className":753},[],[755],{"type":693,"value":756},"ё",{"type":693,"value":758}," и т.д.",{"data":760,"body":761},{},{"type":685,"children":762},[763,800],{"type":688,"tag":689,"props":764,"children":765},{},[766,768,774,776,782,784,790,792,798],{"type":693,"value":767},"Чтобы пример ",{"type":688,"tag":701,"props":769,"children":771},{"className":770},[],[772],{"type":693,"value":773},"isPalindrom(\"Ротор\") --> true",{"type":693,"value":775}," работал, сравнение должно выполняться без учёта регистра: ",{"type":688,"tag":701,"props":777,"children":779},{"className":778},[],[780],{"type":693,"value":781},"\"Ротор\"",{"type":693,"value":783}," и ",{"type":688,"tag":701,"props":785,"children":787},{"className":786},[],[788],{"type":693,"value":789},"\"ротор\"",{"type":693,"value":791}," должны стать одинаковыми. Для этого выполняется преобразование в нижний регистр через ",{"type":688,"tag":701,"props":793,"children":795},{"className":794},[],[796],{"type":693,"value":797},"toLowerCase()",{"type":693,"value":799},".",{"type":688,"tag":689,"props":801,"children":802},{},[803,805,811,813,819],{"type":693,"value":804},"Иногда требуется Unicode-нормализация: один и тот же видимый символ может быть представлен по-разному (как один кодовый пункт или как последовательность “базовый символ + комбинируемый знак”). Метод ",{"type":688,"tag":701,"props":806,"children":808},{"className":807},[],[809],{"type":693,"value":810},"normalize()",{"type":693,"value":812}," приводит строку к выбранной нормальной форме; практичным вариантом часто является ",{"type":688,"tag":701,"props":814,"children":816},{"className":815},[],[817],{"type":693,"value":818},"\"NFC\"",{"type":693,"value":820},", так как он приводит к канонической композиции.",{"data":822,"body":823},{},{"type":685,"children":824},[825],{"type":688,"tag":689,"props":826,"children":827},{},[828,830,836],{"type":693,"value":829},"Если входом строго является “слово” на кириллице без диакритики и экзотических символов, то ",{"type":688,"tag":701,"props":831,"children":833},{"className":832},[],[834],{"type":693,"value":835},"normalize(\"NFC\")",{"type":693,"value":837}," обычно не влияет на результат, но остаётся безопасной “страховкой” на будущее.",{"data":839,"body":840},{},{"type":685,"children":841},[842,868,890,895,904,909],{"type":688,"tag":689,"props":843,"children":844},{},[845,847,853,855,861,862,866],{"type":693,"value":846},"У палиндрома всегда выполняется условие: символ на позиции ",{"type":688,"tag":701,"props":848,"children":850},{"className":849},[],[851],{"type":693,"value":852},"i",{"type":693,"value":854}," равен символу на позиции ",{"type":688,"tag":701,"props":856,"children":858},{"className":857},[],[859],{"type":693,"value":860},"len - 1 - i",{"type":693,"value":799},{"type":688,"tag":863,"props":864,"children":865},"br",{},[],{"type":693,"value":867},"\nИз этого следует две полезные идеи:",{"type":688,"tag":869,"props":870,"children":871},"ul",{},[872,878],{"type":688,"tag":873,"props":874,"children":875},"li",{},[876],{"type":693,"value":877},"достаточно проверить только первую половину строки;",{"type":688,"tag":873,"props":879,"children":880},{},[881,883,888],{"type":693,"value":882},"при первом несовпадении можно сразу вернуть ",{"type":688,"tag":701,"props":884,"children":886},{"className":885},[],[887],{"type":693,"value":722},{"type":693,"value":889}," (ранний выход), не продолжая вычисления.",{"type":688,"tag":689,"props":891,"children":892},{},[893],{"type":693,"value":894},"Наглядная схема индексов для строки длины 5:",{"type":688,"tag":731,"props":896,"children":899},{"className":897,"code":898,"language":693},[734],"индексы:  0   1   2   3   4\nсимволы:  a   b   c   b   a\nпары:    (0,4) (1,3) центр=2\n",[900],{"type":688,"tag":701,"props":901,"children":902},{"__ignoreMap":739},[903],{"type":693,"value":898},{"type":688,"tag":689,"props":905,"children":906},{},[907],{"type":693,"value":908},"Для чётной длины, например 6:",{"type":688,"tag":731,"props":910,"children":913},{"className":911,"code":912,"language":693},[734],"индексы:  0   1   2   3   4   5\nсимволы:  a   b   c   c   b   a\nпары:    (0,5) (1,4) (2,3)\n",[914],{"type":688,"tag":701,"props":915,"children":916},{"__ignoreMap":739},[917],{"type":693,"value":912},{"data":919,"body":920},{},{"type":685,"children":921},[922,943],{"type":688,"tag":689,"props":923,"children":924},{},[925,927,933,935,941],{"type":693,"value":926},"Если строка длины ",{"type":688,"tag":701,"props":928,"children":930},{"className":929},[],[931],{"type":693,"value":932},"n",{"type":693,"value":934},", то в вариантах B и C выполняется примерно ",{"type":688,"tag":701,"props":936,"children":938},{"className":937},[],[939],{"type":693,"value":940},"n/2",{"type":693,"value":942}," сравнений, но по принятой оценке сложности это O(n), потому что рост линейный. Память в этих вариантах O(1), так как не создаётся строка-«копия наоборот», сравнение происходит “на месте” по индексам.",{"type":688,"tag":689,"props":944,"children":945},{},[946,948,954,956,962,964,970],{"type":693,"value":947},"Вариант A также имеет линейное время, но дополнительно создаёт структуру для разворота (",{"type":688,"tag":701,"props":949,"children":951},{"className":950},[],[952],{"type":693,"value":953},"split",{"type":693,"value":955}," → массив, затем ",{"type":688,"tag":701,"props":957,"children":959},{"className":958},[],[960],{"type":693,"value":961},"reverse",{"type":693,"value":963},", затем ",{"type":688,"tag":701,"props":965,"children":967},{"className":966},[],[968],{"type":693,"value":969},"join",{"type":693,"value":971},"), поэтому расход памяти выше.",{"data":973,"body":974},{},{"type":685,"children":975},[976,981,1049,1054],{"type":688,"tag":689,"props":977,"children":978},{},[979],{"type":693,"value":980},"Ниже перечислены ситуации, которые часто встречаются в реальном коде и помогают сделать функцию надёжнее.",{"type":688,"tag":869,"props":982,"children":983},{},[984,1020,1025,1030],{"type":688,"tag":873,"props":985,"children":986},{},[987,989,995,997,1003,1005,1011,1012,1018],{"type":693,"value":988},"Не строковый ввод: преобразование через ",{"type":688,"tag":701,"props":990,"children":992},{"className":991},[],[993],{"type":693,"value":994},"String(str)",{"type":693,"value":996}," позволяет избежать ошибок при значениях вроде ",{"type":688,"tag":701,"props":998,"children":1000},{"className":999},[],[1001],{"type":693,"value":1002},"123",{"type":693,"value":1004},", ",{"type":688,"tag":701,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":693,"value":1010},"null",{"type":693,"value":1004},{"type":688,"tag":701,"props":1013,"children":1015},{"className":1014},[],[1016],{"type":693,"value":1017},"undefined",{"type":693,"value":1019}," и всегда вернуть булево значение.",{"type":688,"tag":873,"props":1021,"children":1022},{},[1023],{"type":693,"value":1024},"Пустая строка и строка из 1 символа: формально являются палиндромами, потому что читаются одинаково в обе стороны; при необходимости можно отдельно ввести правило “длина должна быть больше 1”.",{"type":688,"tag":873,"props":1026,"children":1027},{},[1028],{"type":693,"value":1029},"Пробелы и знаки препинания: в данной формулировке задача про “слово”, поэтому фильтрация не требуется; для “фразового палиндрома” обычно добавляется удаление не-буквенно-цифровых символов и только затем выполняется сравнение.",{"type":688,"tag":873,"props":1031,"children":1032},{},[1033,1035,1041,1043,1048],{"type":693,"value":1034},"Локаль и регистр: ",{"type":688,"tag":701,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":693,"value":1040},"toLocaleLowerCase()",{"type":693,"value":1042}," может зависеть от локали, поэтому для предсказуемого результата чаще берётся ",{"type":688,"tag":701,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":693,"value":797},{"type":693,"value":799},{"type":688,"tag":689,"props":1050,"children":1051},{},[1052],{"type":693,"value":1053},"При необходимости реализации “палиндрома-фразы” может быть добавлен отдельный этап “очистки” строки (пример показан как дополнительный материал):",{"type":688,"tag":731,"props":1055,"children":1058},{"className":1056,"code":1057,"language":693},[734],"function isPalindromPhrase(str) {\n  const s = String(str)\n    .normalize(\"NFC\")\n    .toLowerCase()\n    .replace(/[^0-9a-zа-яё]/gi, \"\");\n\n  let left = 0;\n  let right = s.length - 1;\n\n  while (left \u003C right) {\n    if (s[left] !== s[right]) return false;\n    left++;\n    right--;\n  }\n\n  return true;\n}\n",[1059],{"type":688,"tag":701,"props":1060,"children":1061},{"__ignoreMap":739},[1062],{"type":693,"value":1057},{"data":1064,"body":1065},{},{"type":685,"children":1066},[1067],{"type":688,"tag":689,"props":1068,"children":1069},{},[1070,1072,1077],{"type":693,"value":1071},"Регулярное выражение для “очистки” зависит от требований: какие алфавиты поддерживаются, нужно ли сохранять ",{"type":688,"tag":701,"props":1073,"children":1075},{"className":1074},[],[1076],{"type":693,"value":756},{"type":693,"value":1078},", что делать с дефисом и т.д.; универсального варианта без уточнения правил не существует.",{"data":1080,"body":1081},{},{"type":685,"children":1082},[1083],{"type":688,"tag":689,"props":1084,"children":1085},{},[1086,1088,1094,1095,1101,1103,1108,1110,1115],{"type":693,"value":1087},"Кратко: палиндром определяется сравнением симметричных символов ",{"type":688,"tag":701,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":693,"value":1093},"s[i]",{"type":693,"value":783},{"type":688,"tag":701,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":693,"value":1100},"s[len - 1 - i]",{"type":693,"value":1102},", причём достаточно пройти до середины строки. Для примера с ",{"type":688,"tag":701,"props":1104,"children":1106},{"className":1105},[],[1107],{"type":693,"value":781},{"type":693,"value":1109}," требуется приведение к одному регистру, а для большей устойчивости к Unicode-особенностям полезно добавить ",{"type":688,"tag":701,"props":1111,"children":1113},{"className":1112},[],[1114],{"type":693,"value":835},{"type":693,"value":1116},"; самым практичным считается подход “два указателя” с O(n) по времени и O(1) по памяти.",1775575822678]