[{"data":1,"prerenderedAt":1021},["ShallowReactive",2],{"$fLQqavtGG0LgL5iyde99z6wQAcbDDFzEO4GR2lbaaePw":3,"$f-KhKwB8J0md5Q3U1oyqNCQbHxVpirjaanlJWCGo_ht4":84,"$fkVWEWXZHbLy86BhC78gDVDJ_00TY4k_DsdZD3Mz6ZO0":87,"$fqGwjmVbyPxmA5lnsLz9nF3m-ncS8WzLIlTsTA85cuZA":92,"$fVMSX_HWVzVkzv-u5ATHiOgClblPaIGZfXUn_Cq8LKn4":438,"$fw0tI3d-iV2W3zZtbRjyPNNRSgXGobrmwsMU7a1fynls":659,"mdc-26xr3k-key":679,"mdc--3nyats-key":755,"mdc-hjcywd-key":836,"mdc-ciluqw-key":853,"mdc-pznh54-key":1013},{"content":4,"livecodingContent":30,"type":72,"pageMeta":73},[5,9,13,16,20,24,27],{"id":6,"value":7,"isTypeH1":8},"1982","Для каждой ветви дерева записать номер вложенности данной ветви",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4619","Теория по задаче","theory-for-the-task",{"id":14,"value":15,"isTypeParagraph":8},"10626","Дерево — это структура данных, где каждый узел может иметь несколько дочерних узлов. В данном формате каждый узел имеет поле `next`, которое либо содержит массив дочерних узлов, либо равно `null`.\n\n«Уровень вложенности» (глубина) — это номер слоя, на котором находится узел: корень считается уровнем 1, его прямые дети — уровнем 2 и так далее. Поэтому во время обхода достаточно знать текущий уровень и увеличивать его на 1 при переходе к дочернему узлу.\n\nРекурсия — естественный способ обхода деревьев, потому что поддерево имеет ту же структуру, что и всё дерево: «узел + его дети». Чтобы рекурсия завершилась, необходимо условие остановки (базовый случай), например: «если узел равен `null`» или «если `next` не является массивом».\n\nИтеративный обход решает ту же задачу, но вручную хранит «что обрабатывать дальше». Для этого удобно использовать стек:\n- В стек кладётся корень с уровнем 1.\n- Из стека достаётся элемент, в него записывается `valueNode`.\n- В стек добавляются его дети с уровнем на 1 больше.",{"id":17,"description":18,"titleAlert":19,"isTypeAlertWarning":8},"778","Если в данных возможны циклические ссылки (например, узел прямо или косвенно ссылается сам на себя), рекурсивный обход без защиты может уйти в бесконечный цикл. Для таких случаев необходимо добавлять структуру `Set` для учёта посещённых узлов и прекращать обработку повторов.",null,{"id":21,"value":22,"anchor":23,"isTypeH2":8},"4620","Схема и сложность","scheme-and-complexity",{"id":25,"value":26,"isTypeParagraph":8},"10627","Схема уровней для примера:\n\n```\nroot (level 1)\n├─ child (level 2)\n├─ child (level 2)\n├─ child (level 2)\n└─ child (level 2)\n   ├─ grandchild (level 3)\n   └─ grandchild (level 3)\n```\n\nОценка сложности (для всех вариантов, если каждый узел посещается один раз):\n- Время: O(n), где n — количество узлов.\n- Память:\n  - Рекурсия: O(h) на глубину h (стек вызовов) + при создании нового дерева дополнительно O(n) на новые объекты.\n  - Итерация со стеком: O(k) на стек обхода (в худшем случае до O(n)) + при клонировании дополнительно память под копию.\n\nТаблица выбора подхода:\n\n| Подход | Меняется исходный объект | Подходит для большой глубины | Когда выбирать |\n|---|---:|---:|---|\n| Вариант A (рекурсия + новое дерево) | Нет | Иногда нет (зависит от глубины) | Когда важна неизменность данных и глубина умеренная |\n| Вариант B (итерация + стек) | Нет (если есть копия) | Да | Когда глубина может быть большой |\n| Вариант C (мутация) | Да | Иногда нет (зависит от глубины) | Когда допустимо менять исходный объект и важна простота |",{"id":28,"value":29,"isTypeParagraph":8},"10628","Кратко: задача решается обходом дерева с передачей текущего уровня, который увеличивается при переходе к дочерним узлам; для простоты подходит рекурсия, для очень глубокой вложенности — итеративный обход со стеком, а для неизменности исходных данных — построение нового дерева или предварительное клонирование.",{"id":31,"functionTestData":32,"functionName":68,"functionTemplateCode":69,"solution":70,"description":71},"423",[33,56],[34,44],[35],{"next":36},[37,38,39,40],{"next":19},{"next":19},{"next":19},{"next":41},[42,43],{"next":19},{"next":19},{"next":45,"valueNode":55},[46,48,49,50],{"next":19,"valueNode":47},2,{"next":19,"valueNode":47},{"next":19,"valueNode":47},{"next":51,"valueNode":47},[52,54],{"next":19,"valueNode":53},3,{"next":19,"valueNode":53},1,[57,63],[58],{"next":59},[60],{"next":61},[62],{"next":19},{"next":64,"valueNode":55},[65],{"next":66,"valueNode":47},[67],{"next":19,"valueNode":53},"getNestingLevelThree","function getNestingLevelThree(three) {\n    // ваш код здесь\n}","**Вариант A** — рекурсия без изменения исходного объекта\n\n```\nconst getNestingLevelThree = (root) => addLevel(root, 1);\n\nconst addLevel = (node, level) => {\n  if (node === null || typeof node !== \"object\") return node;\n\n  const next =\n    Array.isArray(node.next)\n      ? node.next.map((child) => addLevel(child, level + 1))\n      : null;\n\n  return {\n    ...node,\n    valueNode: level,\n    next,\n  };\n};\n```\n\n**Вариант B** — итеративный обход (стек) без рекурсии\n\n\nДанный вариант делает то же самое, но без рекурсивных вызовов: вместо этого используется массив-стек, в котором хранятся пары `{ node, level }`. Вариант особенно полезен, если дерево может быть очень глубоким, потому что не нагружает стек вызовов.\n\nПри слишком глубокой рекурсии в JavaScript может возникать ошибка переполнения стека вызовов (в практических задачах это проявляется как “Maximum call stack size exceeded”), поэтому для глубокой вложенности следует рассматривать итеративный обход.\n\n```\nconst getNestingLevelThree = (root) => {\n  if (root === null || typeof root !== \"object\") return root;\n\n  // Глубокое клонирование через JSON подходит только для простых данных:\n  // не сохраняет функции, undefined, Date, Map/Set и ломается на циклических ссылках.\n  const clone = JSON.parse(JSON.stringify(root));\n\n  const stack = [{ node: clone, level: 1 }];\n\n  while (stack.length > 0) {\n    const { node, level } = stack.pop();\n    node.valueNode = level;\n\n    if (Array.isArray(node.next)) {\n      for (let i = node.next.length - 1; i >= 0; i--) {\n        stack.push({ node: node.next[i], level: level + 1 });\n      }\n    } else {\n      node.next = null;\n    }\n  }\n\n  return clone;\n};\n```\n\nЕсли требуется корректная глубокая копия «современного» объекта (например, с `Date`, `Map/Set` или с циклическими ссылками), следует рассматривать `structuredClone`, но поддержка зависит от окружения (браузер/Node.js и версия).\n\n**Вариант C** — рекурсия «на месте» (меняет исходный объект)\n\nДанный вариант наиболее короткий, но изменяет исходный объект, что часто нежелательно (например, при хранении состояния и необходимости предсказуемых обновлений).\n\n```\nconst getNestingLevelThree = (root) => {\n  const walk = (node, level) => {\n    if (node === null || typeof node !== \"object\") return;\n\n    node.valueNode = level;\n\n    if (Array.isArray(node.next)) {\n      for (const child of node.next) {\n        walk(child, level + 1);\n      }\n    } else {\n      node.next = null;\n    }\n  };\n\n  walk(root, 1);\n  return root;\n};\n```\n\n","Есть дерево (вложенный объект):\n\n```\nconst three = {\n  next: [\n    {\n      next: null,\n    },\n    {\n      next: null,\n    },\n    {\n      next: null,\n    },\n    {\n      next: [\n        {\n          next: null,\n        },\n        {\n          next: null,\n        },\n      ],\n    },\n  ],\n}\n```\nНеобходимо записать номер вложенности данной ветви:\n\n```\ngetNestingLevelThree(three) -->\n\n{\n  valueNode: 1,\n  next: [\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: [\n        {\n          valueNode: 3,\n          next: null,\n        },\n        {\n          valueNode: 3,\n          next: null,\n        },\n      ],\n    },\n  ],\n}\n```\n\nПримеры:\n\n```\n // Аргумент функции:\n {\n  next: [\n    {\n      next: null,\n    },\n    {\n      next: null,\n    },\n    {\n      next: null,\n    },\n    {\n      next: [\n        {\n          next: null,\n        },\n        {\n          next: null,\n        },\n      ],\n    },\n  ],\n}\n\n//  Возвращаемое значение функции:\n{\n  valueNode: 1,\n  next: [\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: [\n        {\n          valueNode: 3,\n          next: null,\n        },\n        {\n          valueNode: 3,\n          next: null,\n        },\n      ],\n    },\n  ],\n}\n```\n\n```\n// Аргумент функции:\n{\n  next: [\n    {\n      next: [\n        {\n          next: null\n        }\n      ]\n    }\n  ]\n}\n\n// Возвращаемое значение функции:\n\n{\n  valueNode: 1,\n  next: [\n    {\n      valueNode: 2,\n      next: [\n        {\n          valueNode: 3,\n          next: null\n        }\n      ]\n    }\n  ]\n}\n```\n\nP.s. результаты функции и тестовых данных сравниваются с помощью результата оборачивания объектов в `JSON.stringify`, поэтому соблюдение порядка полей важно.","livecoding",{"title":74,"description":75,"ogTitle":7,"ogDescription":76,"ogImageUrl":77,"canonical":19,"ogLocale":78,"ogSiteName":79,"ogImageType":80,"ogImageWidth":81,"ogImageHeight":82,"ogType":83,"ogUrl":19},"Записать уровень вложенности каждой ветки дерева","const tree = {\n  next: [\n    {\n      next: null,\n    },\n    {\n      next: null,\n    },\n    {\n      next: null,\n    },\n  ],\n}","const tree = {   next: [     {       next: null,     },     {       next: null,     },     {       next: null,     },   ], }","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":85,"siteUrl":86},"GOOD WEB JOB!","https://goodwebjob.ru",[88],{"label":89,"slug":90,"to":91},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":93,"navigationSublist":102},[94,98],{"path":91,"isActive":95,"name":96,"icon":97,"isNavbarMobileDisabled":8},false,"С чего начать?","material-symbols:visibility-outline-rounded",{"path":99,"isActive":8,"name":100,"icon":101,"isNavbarMobileDisabled":95},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[103,112,139,151,157,297,321,330,336,399,420,426],{"title":104,"list":105,"isOpened":95},"Bash",[106,109],{"name":107,"path":108,"isActive":95},"Дан фрагмент 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":110,"path":111,"isActive":95},"Дан фрагмент 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":113,"list":114,"isOpened":95},"CSS",[115,118,121,124,127,130,133,136],{"name":116,"path":117,"isActive":95},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":119,"path":120,"isActive":95},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":122,"path":123,"isActive":95},"Есть шаблон вложенного 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":125,"path":126,"isActive":95},"Есть шаблон вложенного 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":128,"path":129,"isActive":95},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":131,"path":132,"isActive":95},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":134,"path":135,"isActive":95},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":137,"path":138,"isActive":95},"Есть 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":140,"list":141,"isOpened":95},"Git",[142,145,148],{"name":143,"path":144,"isActive":95},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/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":146,"path":147,"isActive":95},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":149,"path":150,"isActive":95},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":152,"list":153,"isOpened":95},"HTML",[154],{"name":155,"path":156,"isActive":95},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":158,"list":159,"isOpened":95},"JavaScript",[160,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,258,261,264,267,270,273,276,279,282,285,288,291,294],{"name":161,"path":162,"isActive":95},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":164,"path":165,"isActive":95},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":167,"path":168,"isActive":95},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":170,"path":171,"isActive":95},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":173,"path":174,"isActive":95},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":176,"path":177,"isActive":95},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":179,"path":180,"isActive":95},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение 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":182,"path":183,"isActive":95},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":185,"path":186,"isActive":95},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":188,"path":189,"isActive":95},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":191,"path":192,"isActive":95},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":194,"path":195,"isActive":95},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":197,"path":198,"isActive":95},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":200,"path":201,"isActive":95},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":203,"path":204,"isActive":95},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":206,"path":207,"isActive":95},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":209,"path":210,"isActive":95},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":212,"path":213,"isActive":95},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":215,"path":216,"isActive":95},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":218,"path":219,"isActive":95},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":221,"path":222,"isActive":95},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":224,"path":225,"isActive":95},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":227,"path":228,"isActive":95},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":230,"path":231,"isActive":95},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":233,"path":234,"isActive":95},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":236,"path":237,"isActive":95},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":239,"path":240,"isActive":95},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":242,"path":243,"isActive":95},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":245,"path":246,"isActive":95},"Вернуть массив от 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":248,"path":249,"isActive":95},"Дана строка: '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":251,"path":252,"isActive":95},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":254,"path":255,"isActive":95},"Для каждого вложенного объекта нужно добавить свойство 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":7,"path":257,"isActive":95},"/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":259,"path":260,"isActive":95},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":262,"path":263,"isActive":95},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":265,"path":266,"isActive":95},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":268,"path":269,"isActive":95}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":271,"path":272,"isActive":95},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":274,"path":275,"isActive":95},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":277,"path":278,"isActive":95},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":280,"path":281,"isActive":95},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":283,"path":284,"isActive":95},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":286,"path":287,"isActive":95},"Реализовать функцию, принимающую аргументы \"*\", \"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":289,"path":290,"isActive":95},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":292,"path":293,"isActive":95},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":295,"path":296,"isActive":95},"Числа от 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":298,"list":299,"isOpened":95},"React",[300,303,306,309,312,315,318],{"name":301,"path":302,"isActive":95},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":304,"path":305,"isActive":95},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":307,"path":308,"isActive":95},"Если убрать в 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":310,"path":311,"isActive":95},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":313,"path":314,"isActive":95},"Есть код, в котором список и кнопка. Что в реальном 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":316,"path":317,"isActive":95},"Зачем нужен 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":319,"path":320,"isActive":95},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/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":322,"list":323,"isOpened":95},"Алгоритмы",[324,327],{"name":325,"path":326,"isActive":95},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":328,"path":329,"isActive":95},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":331,"list":332,"isOpened":95},"Дебаггинг",[333],{"name":334,"path":335,"isActive":95},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/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":337,"list":338,"isOpened":95},"Компьютерные сети",[339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384,387,390,393,396],{"name":340,"path":341,"isActive":95},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":343,"path":344,"isActive":95},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":346,"path":347,"isActive":95},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":349,"path":350,"isActive":95},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":352,"path":353,"isActive":95},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":355,"path":356,"isActive":95},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":358,"path":359,"isActive":95},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":361,"path":362,"isActive":95},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":364,"path":365,"isActive":95},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":367,"path":368,"isActive":95},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":370,"path":371,"isActive":95},"Чем отличаются 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":373,"path":374,"isActive":95},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/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":376,"path":377,"isActive":95},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":379,"path":380,"isActive":95},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":382,"path":383,"isActive":95},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":385,"path":386,"isActive":95},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/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":388,"path":389,"isActive":95},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":391,"path":392,"isActive":95},"Все данные зашифрованы, используется 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":394,"path":395,"isActive":95},"Есть веб-приложение. Помимо 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":397,"path":398,"isActive":95},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":400,"list":401,"isOpened":95},"Отрисовка в браузере",[402,405,408,411,414,417],{"name":403,"path":404,"isActive":95},"Что происходит, когда 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":406,"path":407,"isActive":95},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":409,"path":410,"isActive":95},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":412,"path":413,"isActive":95},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":415,"path":416,"isActive":95},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":418,"path":419,"isActive":95},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":421,"list":422,"isOpened":95},"Ревью кода",[423],{"name":424,"path":425,"isActive":95},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":427,"list":428,"isOpened":95},"Теория вероятности",[429,432,435],{"name":430,"path":431,"isActive":95},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/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":433,"path":434,"isActive":95},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/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":436,"path":437,"isActive":95},"Как гарантированно найти лёгкую фальшивую монету среди 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":439},[440,443,445,447,449,452,455,457,459,461,463,465,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,630,632,634,636,638,640,642,644,646,648,649,651,653,655,657],{"name":441,"value":442},"Теоретические задания","theoretical-tasks",{"name":197,"value":444},"what-this-code-will-return-typeof-function",{"name":96,"value":446},"where-to-begin",{"name":164,"value":448},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":450,"value":451},"Backend","backend",{"name":453,"value":454},"Frontend","frontend",{"name":161,"value":456},"prototype-what-logical-values-will-be-received-in-console-log",{"name":277,"value":458},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":268,"value":460},"find-non-repeating-numbers-in-an-array",{"name":242,"value":462},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":248,"value":464},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":466,"value":467},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":254,"value":469},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":170,"value":471},"what-value-will-the-console-output-with-object-property",{"name":173,"value":473},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":245,"value":475},"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":274,"value":477},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":280,"value":479},"determines-whether-a-word-is-a-palindrome",{"name":259,"value":481},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":286,"value":483},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":251,"value":485},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":7,"value":487},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":262,"value":489},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":295,"value":491},"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":265,"value":493},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":271,"value":495},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":176,"value":497},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":179,"value":499},"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":191,"value":501},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":194,"value":503},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":292,"value":505},"unifying-values-in-an-array",{"name":283,"value":507},"flattening-the-array",{"name":182,"value":509},"what-will-the-book-get-upper-name-method-return",{"name":289,"value":511},"string-compression",{"name":188,"value":513},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":200,"value":515},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":340,"value":517},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":346,"value":519},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":349,"value":521},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":352,"value":523},"key-differences-between-tcp-and-udp",{"name":355,"value":525},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":358,"value":527},"what-is-http-and-what-does-it-consist-of",{"name":361,"value":529},"what-are-http-headers-and-why-do-we-need-them",{"name":364,"value":531},"what-are-http-parameters",{"name":367,"value":533},"where-is-the-html-code-located-in-the-http-response-structure",{"name":155,"value":535},"what-is-html",{"name":370,"value":537},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":373,"value":539},"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":376,"value":541},"what-is-a-cookie",{"name":379,"value":543},"who-initiates-the-cookie-recording-in-the-browser",{"name":382,"value":545},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":547,"value":72},"Лайвкодинг",{"name":167,"value":549},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":388,"value":551},"is-everything-that-goes-through-https-secure",{"name":391,"value":553},"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":394,"value":555},"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":406,"value":557},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":403,"value":559},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":409,"value":561},"what-is-blocking-the-page-rendering-in-the-browser",{"name":412,"value":563},"what-is-dom-in-a-browser-what-is-cssom",{"name":415,"value":565},"what-are-nodes-in-the-dom",{"name":418,"value":567},"what-does-cssom-consist-of",{"name":116,"value":569},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":119,"value":571},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":122,"value":573},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":125,"value":575},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":128,"value":577},"there-is-an-html-code-will-font-weight-affect-span",{"name":131,"value":579},"what-are-the-differences-between-flexbox-and-grid",{"name":134,"value":581},"do-flexbox-and-grid-replace-each-other",{"name":137,"value":583},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":100,"value":585},"tasks",{"name":203,"value":587},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":206,"value":589},"what-is-this-in-javascript",{"name":209,"value":591},"what-is-an-event-loop-and-how-does-it-work",{"name":212,"value":593},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":215,"value":595},"what-does-the-typeof-operator-show-in-javascript",{"name":218,"value":597},"what-types-of-data-exist-in-javascript",{"name":221,"value":599},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":224,"value":601},"what-will-typeof-return-for-an-array",{"name":227,"value":603},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":230,"value":605},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":233,"value":607},"what-does-typeof-return-for-new-set-in-javascript",{"name":301,"value":609},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":307,"value":611},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":310,"value":613},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":313,"value":615},"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":316,"value":617},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":334,"value":619},"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":143,"value":621},"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":146,"value":623},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":149,"value":625},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":424,"value":627},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":107,"value":629},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":110,"value":631},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":325,"value":633},"what-is-algorithmic-complexity",{"name":328,"value":635},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":236,"value":637},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":397,"value":639},"how-can-a-user-be-authorized-on-a-website",{"name":239,"value":641},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":430,"value":643},"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":433,"value":645},"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":436,"value":647},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":89,"value":90},{"name":385,"value":650},"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":343,"value":652},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":185,"value":654},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":304,"value":656},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":319,"value":658},"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":660,"copyright":663,"reportError":664,"socialNetwork":666},{"link":661,"title":662},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":665,"link":661},"Сообщить об ошибке",{"label":667,"socialNetworkList":668},"Мы в соцсетях:",[669,672,675],{"icon":19,"link":670,"title":671},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":673,"link":661,"title":674},"ic:baseline-telegram","Telegram",{"icon":676,"link":677,"title":678},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":680,"body":681},{},{"type":682,"children":683},"root",[684,692,705,710,719,724,733,742],{"type":685,"tag":686,"props":687,"children":688},"element","p",{},[689],{"type":690,"value":691},"text","Есть дерево (вложенный объект):",{"type":685,"tag":693,"props":694,"children":698},"pre",{"className":695,"code":697,"language":690},[696],"language-text","const three = {\n  next: [\n    {\n      next: null,\n    },\n    {\n      next: null,\n    },\n    {\n      next: null,\n    },\n    {\n      next: [\n        {\n          next: null,\n        },\n        {\n          next: null,\n        },\n      ],\n    },\n  ],\n}\n",[699],{"type":685,"tag":700,"props":701,"children":703},"code",{"__ignoreMap":702},"",[704],{"type":690,"value":697},{"type":685,"tag":686,"props":706,"children":707},{},[708],{"type":690,"value":709},"Необходимо записать номер вложенности данной ветви:",{"type":685,"tag":693,"props":711,"children":714},{"className":712,"code":713,"language":690},[696],"getNestingLevelThree(three) -->\n\n{\n  valueNode: 1,\n  next: [\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: [\n        {\n          valueNode: 3,\n          next: null,\n        },\n        {\n          valueNode: 3,\n          next: null,\n        },\n      ],\n    },\n  ],\n}\n",[715],{"type":685,"tag":700,"props":716,"children":717},{"__ignoreMap":702},[718],{"type":690,"value":713},{"type":685,"tag":686,"props":720,"children":721},{},[722],{"type":690,"value":723},"Примеры:",{"type":685,"tag":693,"props":725,"children":728},{"className":726,"code":727,"language":690},[696]," // Аргумент функции:\n {\n  next: [\n    {\n      next: null,\n    },\n    {\n      next: null,\n    },\n    {\n      next: null,\n    },\n    {\n      next: [\n        {\n          next: null,\n        },\n        {\n          next: null,\n        },\n      ],\n    },\n  ],\n}\n\n//  Возвращаемое значение функции:\n{\n  valueNode: 1,\n  next: [\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: [\n        {\n          valueNode: 3,\n          next: null,\n        },\n        {\n          valueNode: 3,\n          next: null,\n        },\n      ],\n    },\n  ],\n}\n",[729],{"type":685,"tag":700,"props":730,"children":731},{"__ignoreMap":702},[732],{"type":690,"value":727},{"type":685,"tag":693,"props":734,"children":737},{"className":735,"code":736,"language":690},[696],"// Аргумент функции:\n{\n  next: [\n    {\n      next: [\n        {\n          next: null\n        }\n      ]\n    }\n  ]\n}\n\n// Возвращаемое значение функции:\n\n{\n  valueNode: 1,\n  next: [\n    {\n      valueNode: 2,\n      next: [\n        {\n          valueNode: 3,\n          next: null\n        }\n      ]\n    }\n  ]\n}\n",[738],{"type":685,"tag":700,"props":739,"children":740},{"__ignoreMap":702},[741],{"type":690,"value":736},{"type":685,"tag":686,"props":743,"children":744},{},[745,747,753],{"type":690,"value":746},"P.s. результаты функции и тестовых данных сравниваются с помощью результата оборачивания объектов в ",{"type":685,"tag":700,"props":748,"children":750},{"className":749},[],[751],{"type":690,"value":752},"JSON.stringify",{"type":690,"value":754},", поэтому соблюдение порядка полей важно.",{"data":756,"body":757},{},{"type":682,"children":758},[759,780,785,804,809],{"type":685,"tag":686,"props":760,"children":761},{},[762,764,770,772,778],{"type":690,"value":763},"Дерево — это структура данных, где каждый узел может иметь несколько дочерних узлов. В данном формате каждый узел имеет поле ",{"type":685,"tag":700,"props":765,"children":767},{"className":766},[],[768],{"type":690,"value":769},"next",{"type":690,"value":771},", которое либо содержит массив дочерних узлов, либо равно ",{"type":685,"tag":700,"props":773,"children":775},{"className":774},[],[776],{"type":690,"value":777},"null",{"type":690,"value":779},".",{"type":685,"tag":686,"props":781,"children":782},{},[783],{"type":690,"value":784},"«Уровень вложенности» (глубина) — это номер слоя, на котором находится узел: корень считается уровнем 1, его прямые дети — уровнем 2 и так далее. Поэтому во время обхода достаточно знать текущий уровень и увеличивать его на 1 при переходе к дочернему узлу.",{"type":685,"tag":686,"props":786,"children":787},{},[788,790,795,797,802],{"type":690,"value":789},"Рекурсия — естественный способ обхода деревьев, потому что поддерево имеет ту же структуру, что и всё дерево: «узел + его дети». Чтобы рекурсия завершилась, необходимо условие остановки (базовый случай), например: «если узел равен ",{"type":685,"tag":700,"props":791,"children":793},{"className":792},[],[794],{"type":690,"value":777},{"type":690,"value":796},"» или «если ",{"type":685,"tag":700,"props":798,"children":800},{"className":799},[],[801],{"type":690,"value":769},{"type":690,"value":803}," не является массивом».",{"type":685,"tag":686,"props":805,"children":806},{},[807],{"type":690,"value":808},"Итеративный обход решает ту же задачу, но вручную хранит «что обрабатывать дальше». Для этого удобно использовать стек:",{"type":685,"tag":810,"props":811,"children":812},"ul",{},[813,819,831],{"type":685,"tag":814,"props":815,"children":816},"li",{},[817],{"type":690,"value":818},"В стек кладётся корень с уровнем 1.",{"type":685,"tag":814,"props":820,"children":821},{},[822,824,830],{"type":690,"value":823},"Из стека достаётся элемент, в него записывается ",{"type":685,"tag":700,"props":825,"children":827},{"className":826},[],[828],{"type":690,"value":829},"valueNode",{"type":690,"value":779},{"type":685,"tag":814,"props":832,"children":833},{},[834],{"type":690,"value":835},"В стек добавляются его дети с уровнем на 1 больше.",{"data":837,"body":838},{},{"type":682,"children":839},[840],{"type":685,"tag":686,"props":841,"children":842},{},[843,845,851],{"type":690,"value":844},"Если в данных возможны циклические ссылки (например, узел прямо или косвенно ссылается сам на себя), рекурсивный обход без защиты может уйти в бесконечный цикл. Для таких случаев необходимо добавлять структуру ",{"type":685,"tag":700,"props":846,"children":848},{"className":847},[],[849],{"type":690,"value":850},"Set",{"type":690,"value":852}," для учёта посещённых узлов и прекращать обработку повторов.",{"data":854,"body":855},{},{"type":682,"children":856},[857,862,871,876,902,907],{"type":685,"tag":686,"props":858,"children":859},{},[860],{"type":690,"value":861},"Схема уровней для примера:",{"type":685,"tag":693,"props":863,"children":866},{"className":864,"code":865,"language":690},[696],"root (level 1)\n├─ child (level 2)\n├─ child (level 2)\n├─ child (level 2)\n└─ child (level 2)\n   ├─ grandchild (level 3)\n   └─ grandchild (level 3)\n",[867],{"type":685,"tag":700,"props":868,"children":869},{"__ignoreMap":702},[870],{"type":690,"value":865},{"type":685,"tag":686,"props":872,"children":873},{},[874],{"type":690,"value":875},"Оценка сложности (для всех вариантов, если каждый узел посещается один раз):",{"type":685,"tag":810,"props":877,"children":878},{},[879,884],{"type":685,"tag":814,"props":880,"children":881},{},[882],{"type":690,"value":883},"Время: O(n), где n — количество узлов.",{"type":685,"tag":814,"props":885,"children":886},{},[887,889],{"type":690,"value":888},"Память:\n",{"type":685,"tag":810,"props":890,"children":891},{},[892,897],{"type":685,"tag":814,"props":893,"children":894},{},[895],{"type":690,"value":896},"Рекурсия: O(h) на глубину h (стек вызовов) + при создании нового дерева дополнительно O(n) на новые объекты.",{"type":685,"tag":814,"props":898,"children":899},{},[900],{"type":690,"value":901},"Итерация со стеком: O(k) на стек обхода (в худшем случае до O(n)) + при клонировании дополнительно память под копию.",{"type":685,"tag":686,"props":903,"children":904},{},[905],{"type":690,"value":906},"Таблица выбора подхода:",{"type":685,"tag":908,"props":909,"children":910},"table",{},[911,941],{"type":685,"tag":912,"props":913,"children":914},"thead",{},[915],{"type":685,"tag":916,"props":917,"children":918},"tr",{},[919,925,931,936],{"type":685,"tag":920,"props":921,"children":922},"th",{},[923],{"type":690,"value":924},"Подход",{"type":685,"tag":920,"props":926,"children":928},{"align":927},"right",[929],{"type":690,"value":930},"Меняется исходный объект",{"type":685,"tag":920,"props":932,"children":933},{"align":927},[934],{"type":690,"value":935},"Подходит для большой глубины",{"type":685,"tag":920,"props":937,"children":938},{},[939],{"type":690,"value":940},"Когда выбирать",{"type":685,"tag":942,"props":943,"children":944},"tbody",{},[945,969,992],{"type":685,"tag":916,"props":946,"children":947},{},[948,954,959,964],{"type":685,"tag":949,"props":950,"children":951},"td",{},[952],{"type":690,"value":953},"Вариант A (рекурсия + новое дерево)",{"type":685,"tag":949,"props":955,"children":956},{"align":927},[957],{"type":690,"value":958},"Нет",{"type":685,"tag":949,"props":960,"children":961},{"align":927},[962],{"type":690,"value":963},"Иногда нет (зависит от глубины)",{"type":685,"tag":949,"props":965,"children":966},{},[967],{"type":690,"value":968},"Когда важна неизменность данных и глубина умеренная",{"type":685,"tag":916,"props":970,"children":971},{},[972,977,982,987],{"type":685,"tag":949,"props":973,"children":974},{},[975],{"type":690,"value":976},"Вариант B (итерация + стек)",{"type":685,"tag":949,"props":978,"children":979},{"align":927},[980],{"type":690,"value":981},"Нет (если есть копия)",{"type":685,"tag":949,"props":983,"children":984},{"align":927},[985],{"type":690,"value":986},"Да",{"type":685,"tag":949,"props":988,"children":989},{},[990],{"type":690,"value":991},"Когда глубина может быть большой",{"type":685,"tag":916,"props":993,"children":994},{},[995,1000,1004,1008],{"type":685,"tag":949,"props":996,"children":997},{},[998],{"type":690,"value":999},"Вариант C (мутация)",{"type":685,"tag":949,"props":1001,"children":1002},{"align":927},[1003],{"type":690,"value":986},{"type":685,"tag":949,"props":1005,"children":1006},{"align":927},[1007],{"type":690,"value":963},{"type":685,"tag":949,"props":1009,"children":1010},{},[1011],{"type":690,"value":1012},"Когда допустимо менять исходный объект и важна простота",{"data":1014,"body":1015},{},{"type":682,"children":1016},[1017],{"type":685,"tag":686,"props":1018,"children":1019},{},[1020],{"type":690,"value":29},1775575822648]