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