Задача: 1234. Replace the Substring for Balanced StringСложность: mediumВам дана строка s длины n, содержащая только четыре вида символов: 'Q', 'W', 'E' и 'R'. Строка считается сбалансированной, если каждый из ее символов встречается n / 4 раз, где n - длина строки. Верните минимальную длину подстроки, которую можно заменить любой другой строкой той же длины, чтобы сделать s сбалансированной. Если s уже сбалансирована, верните 0.Пример:Input: s = "QWER"Output: 0👨💻 Алгоритм:1⃣Проверка баланса:Сначала проверим, сбалансирована ли строка s. Если да, то возвращаем 0.2⃣Подсчет частоты символов:Подсчитаем количество каждого символа в строке s.3⃣Использование скользящего окна:Используем метод двух указателей (скользящее окно) для нахождения минимальной подстроки, которую можно заменить, чтобы строка стала сбалансированной.Начнем с окна, которое захватывает всю строку, и будем постепенно уменьшать его, проверяя при каждом шаге, становится ли строка сбалансированной.😎 Решение:var balancedString = function(s) { const n = s.length; const count = new Map(); for (const c of s) { count.set(c, (count.get(c) || 0) + 1); } const target = n / 4; const isBalanced = () => { return 'QWER'.split('').every(c => (count.get(c) || 0) <= target); }; if (isBalanced()) return 0; let minLength = n; let left = 0; for (let right = 0; right < n; right++) { count.set(s[right], count.get(s[right]) - 1); while (isBalanced()) { minLength = Math.min(minLength, right - left + 1); count.set(s[left], (count.get(s[left]) || 0) + 1); left++; } } return minLength;};Ставь 👍 и забирай 📚 Базу знаний
JavaScript | LeetCode
@easy_frontend_task
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+T0COHtFzCJkwMDUy Вопросы собесов t.me/+kXKgJEjRUww3N2Ni Вакансии t.me/+CgCAzIyGHHg0Nzky
Похожие каналы
Все →Последние посты
Задача: 253. Meeting Rooms IIСложность: mediumДан массив интервалов времени встреч intervals, где intervals[i] = [starti, endi]. Верните минимальное количество необходимых конференц-залов.Пример:Input: intervals = [[0,30],[5,10],[15,20]]Output: 2👨💻 Алгоритм:1️⃣Отсортируйте встречи по времени их начала и инициализируйте мин-кучу с временем окончания первой встречи.2️⃣Для каждой последующей встречи проверьте, свободна ли комната (сравните время начала встречи с минимальным временем окончания в куче):Если свободна, обновите время окончания этой комнаты.Если не свободна, добавьте новое время окончания в кучу.3️⃣После обработки всех встреч размер кучи будет равен минимальному количеству необходимых комнат.😎 Решение:class Solution { minMeetingRooms(intervals) { intervals.sort((a, b) => a[0] - b[0]) const heap = [intervals[0][1]] for (let i = 1; i < intervals.length; i++) { if (intervals[i][0] >= heap[0]) { heap.shift() } heap.push(intervals[i][1]) heap.sort((a, b) => a - b) } return heap.length }}Ставь 👍 и забирай 📚 Базу знаний
Задача: 1380. Lucky Numbers in a MatrixСложность: easy Дана матрица m x n из различных чисел, верните все счастливые числа в матрице в любом порядке.Счастливое число — это элемент матрицы, который является минимальным элементом в своей строке и максимальным в своем столбце.Пример:Input: matrix = [[3,7,8],[9,11,13],[15,16,17]]Output: [15]Explanation: 15 is the only lucky number since it is the minimum in its row and the maximum in its column.👨💻 Алгоритм:1⃣Сохраните минимум каждой строки в список rowMin и максимум каждого столбца в список colMax.2⃣Итерируйте по каждому числу в матрице и проверяйте, равно ли оно rowMin[i] и colMax[j].3⃣Если число удовлетворяет условию, добавьте его в список luckyNumbers и верните luckyNumbers.😎 Решение:var luckyNumbers = function(matrix) { let N = matrix.length; let M = matrix[0].length; let rowMin = []; for (let i = 0; i < N; i++) { let rMin = Math.min(...matrix[i]); rowMin.push(rMin); } let colMax = []; for (let i = 0; i < M; i++) { let cMax = -Infinity; for (let j = 0; j < N; j++) { cMax = Math.max(cMax, matrix[j][i]); } colMax.push(cMax); } let luckyNumbers = []; for (let i = 0; i < N; i++) { for (let j = 0; j < M; j++) { if (matrix[i][j] === rowMin[i] && matrix[i][j] === colMax[j]) { luckyNumbers.push(matrix[i][j]); } } } return luckyNumbers;};Ставь 👍 и забирай 📚 Базу знаний
Задача: 1255. Maximum Score Words Formed by LettersСложность: hard Даны список слов, список отдельных букв (могут повторяться) и оценка каждого символа. Верните максимальную оценку любого правильного набора слов, образованного с помощью заданных букв (words[i] не может быть использовано два или более раз). Не обязательно использовать все символы в буквах, каждая буква может быть использована только один раз. Оценка букв 'a', 'b', 'c', ... , 'z' задаются значениями score[0], score[1], ... , score[25] соответственно.Пример:Input: words = ["dog","cat","dad","good"], letters = ["a","a","c","d","d","d","g","o","o"], score = [1,0,9,5,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0]Output: 23👨💻 Алгоритм:1⃣Создайте функцию для вычисления оценки слова.2⃣Используйте метод перебора подмножеств (или битовое представление всех подмножеств) для нахождения всех возможных комбинаций слов.Для каждой комбинации проверяйте, можно ли составить каждое слово из доступных букв.3⃣Вычислите суммарную оценку для каждой допустимой комбинации слов и сохраните максимальную оценку.😎 Решение:var maxScoreWords = function(words, letters, score) { const wordScore = word => word.split('').reduce((acc, ch) => acc + score[ch.charCodeAt(0) - 'a'.charCodeAt(0)], 0); const canFormWord = (word, letterCount) => { const wordCount = {}; for (const ch of word) { wordCount[ch] = (wordCount[ch] || 0) + 1; if (wordCount[ch] > (letterCount[ch] || 0)) { return false; } } return true; }; let maxScore = 0; const letterCount = {}; for (const ch of letters) { letterCount[ch] = (letterCount[ch] || 0) + 1; } const n = words.length; for (let i = 1; i < (1 << n); i++) { let currScore = 0; const usedLetters = {}; let valid = true; for (let j = 0; j < n; j++) { if (i & (1 << j)) { const word = words[j]; if (canFormWord(word, {...letterCount, ...used
Задача: 857. Minimum Cost to Hire K WorkersСложность: hardЕсть n работников. Вам даны два целочисленных массива: quality и wage, где quality[i] — качество работы i-го работника, а wage[i] — минимальная ожидаемая заработная плата i-го работника.Мы хотим нанять ровно k работников для формирования оплачиваемой группы. Чтобы нанять группу из k работников, мы должны оплатить их в соответствии со следующими правилами:Каждому работнику в оплачиваемой группе должно быть выплачено как минимум его ожидаемое минимальное вознаграждение.В группе заработная плата каждого работника должна быть прямо пропорциональна его качеству. Это означает, что если качество работы одного работника вдвое выше, чем у другого работника в группе, то ему должно быть выплачено вдвое больше.Учитывая целое число k, верните наименьшую сумму денег, необходимую для формирования оплачиваемой группы, удовлетворяющей указанным условиям. Ответы с точностью до 10^-5 от фактического ответа будут приняты.Пример:Input: quality = [10,20,5], wage = [70,50,30], k = 2Output: 105.00000Explanation: We pay 70 to 0th worker and 35 to 2nd worker.👨💻 Алгоритм:1⃣Инициализируйте переменные: n для размера массивов quality и wage, totalCost для минимальной стоимости (начальное значение - максимум) и currentTotalQuality для суммы качеств текущих работников. Создайте массив wageToQualityRatio для хранения отношения заработной платы к качеству и качества каждого работника. Рассчитайте и сохраните отношение заработной платы к качеству для каждого работника в wageToQualityRatio. Отсортируйте wageToQualityRatio по возрастанию.2⃣Создайте приоритетную очередь workers (максимальная куча) для хранения выбранных работников. Итерируйте через отсортированный wageToQualityRatio: добавляйте качество текущего работника в workers и обновляйте currentTotalQuality.3⃣Если размер workers превышает k, удалите работника с наибольшим качеством из workers и обновите currentTotalQuality. Если размер workers равен k, рассчитайте общую стоимость, умнож
Задача: 907. Sum of Subarray MinimumsСложность: mediumУчитывая массив целых чисел arr, найдите сумму min(b), где b находится в каждом (смежном) подмассиве arr. Поскольку ответ может быть большим, верните ответ по модулю 109 + 7.Пример:Input: arr = [3,1,2,4]Output: 17👨💻 Алгоритм:1⃣Использовать монотонный стек для нахождения ближайшего меньшего элемента слева и справа для каждого элемента массива.2⃣Использовать эту информацию для вычисления количества подмассивов, где каждый элемент является минимальным.3⃣Вычислить сумму минимальных значений для всех подмассивов и вернуть результат по модулю 10^9 + 7.😎 Решение:var sumSubarrayMins = function(arr) { const MOD = 1e9 + 7; const n = arr.length; const left = new Array(n).fill(0); const right = new Array(n).fill(0); const stack = []; for (let i = 0; i < n; i++) { while (stack.length && arr[stack[stack.length - 1]] > arr[i]) { stack.pop(); } left[i] = stack.length ? i - stack[stack.length - 1] : i + 1; stack.push(i); } stack.length = 0; for (let i = n - 1; i >= 0; i--) { while (stack.length && arr[stack[stack.length - 1]] >= arr[i]) { stack.pop(); } right[i] = stack.length ? stack[stack.length - 1] - i : n - i; stack.push(i); } let result = 0; for (let i = 0; i < n; i++) { result = (result + arr[i] * left[i] * right[i]) % MOD; } return result;};Ставь 👍 и забирай 📚 Базу знаний
Задача: 423. Reconstruct Original Digits from EnglishСложность: mediumДана строка s, содержащая неупорядоченное английское представление цифр от 0 до 9, верните цифры в порядке возрастания.Пример:Input: s = "owoztneoer"Output: "012"👨💻 Алгоритм:1⃣Подсчитайте количество каждого символа в строке s с помощью хэш-таблицы или массива, чтобы определить количество каждого символа.2⃣Используйте уникальные символы, присутствующие только в одном числе (например, 'z' для 0, 'w' для 2, 'u' для 4, 'x' для 6, 'g' для 8), чтобы определить количество этих цифр в строке. Затем определите количество остальных цифр, вычитая уже найденные цифры.3⃣Соберите найденные цифры в строку в порядке возрастания и верните результат.😎 Решение:class Solution { originalDigits(s) { const count = new Array(26).fill(0); for (const letter of s) { count[letter.charCodeAt(0) - 97]++; } const out = new Array(10).fill(0); out[0] = count[25]; out[2] = count[22]; out[4] = count[20]; out[6] = count[23]; out[8] = count[6]; out[3] = count[7] - out[8]; out[5] = count[5] - out[4]; out[7] = count[18] - out[6]; out[9] = count[8] - out[5] - out[6] - out[8]; out[1] = count[13] - out[7] - 2 * out[9]; const output = []; for (let i = 0; i < 10; i++) { for (let j = 0; j < out[i]; j++) { output.push(i); } } return output.join(''); }}Ставь 👍 и забирай 📚 Базу знаний
Задача: 928. Minimize Malware Spread IIСложность: hardВам дана сеть из n узлов, представленная в виде графа с матрицей смежности n x n, где i-й узел непосредственно связан с j-м узлом, если graph[i][j] == 1. Некоторые узлы изначально заражены вредоносным ПО. Если два узла соединены напрямую и хотя бы один из них заражен вредоносным ПО, то оба узла будут заражены вредоносным ПО. Такое распространение вредоносного ПО будет продолжаться до тех пор, пока больше не останется ни одного узла, зараженного таким образом. Предположим, что M(initial) - это конечное число узлов, зараженных вредоносным ПО, во всей сети после прекращения распространения вредоносного ПО. Мы удалим ровно один узел из initial, полностью удалив его и все связи от этого узла к любому другому узлу. Верните узел, который, если его удалить, минимизирует M(initial). Если для минимизации M(initial) можно удалить несколько узлов, верните такой узел с наименьшим индексом.Пример:Input: graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1]Output: 0👨💻 Алгоритм:1⃣Определить компоненты связности в графе.Для каждой компоненты связности определить количество зараженных узлов и общее количество узлов.2⃣Для каждого узла в initial удалить его и пересчитать количество зараженных узлов.3⃣Найти узел, удаление которого минимизирует количество зараженных узлов. Если несколько узлов минимизируют количество зараженных узлов одинаково, выбрать узел с наименьшим индексом.😎 Решение:var minMalwareSpread = function(graph, initial) { const n = graph.length; const visited = new Set(); const components = []; const dfs = (node) => { const stack = [node]; const component = new Set(); while (stack.length) { const u = stack.pop(); if (!visited.has(u)) { visited.add(u); component.add(u); for (let v = 0; v < n; v++) { if (graph[u][v] === 1 && !visited.has(v)) { stack.push(v); }
Задача: 1049. Last Stone Weight IIСложность: mediumВам дан массив целых чисел stones, где stones[i] - вес i-го камня. Мы играем в игру с камнями. На каждом ходу мы выбираем два любых камня и разбиваем их вместе. Предположим, что камни имеют веса x и y, причем x <= y. Результат разбивания таков: если x == y, оба камня уничтожаются, а если x != y, камень веса x уничтожается, а камень веса y приобретает новый вес y - x. В конце игры остается не более одного камня. Верните наименьший возможный вес оставшегося камня. Если камней не осталось, верните 0.Пример:Input: stones = [2,7,4,1,8,1]Output: 1👨💻 Алгоритм:1⃣Используй метод динамического программирования, чтобы проверить, можно ли разделить камни на две группы с равной суммой.2⃣Определи, какие веса можно достичь, используя половину суммы всех камней.3⃣Найди наибольшую достижимую сумму, которая меньше или равна половине общей суммы, и верни разницу между общей суммой и удвоенной этой суммой.Верни максимальную длину среди всех цепочек.😎 Решение:function lastStoneWeightII(stones) { const totalSum = stones.reduce((a, b) => a + b, 0); const halfSum = Math.floor(totalSum / 2); const dp = Array(halfSum + 1).fill(0); for (let stone of stones) { for (let j = halfSum; j >= stone; j--) { dp[j] = Math.max(dp[j], dp[j - stone] + stone); } } return totalSum - 2 * dp[halfSum];}Ставь 👍 и забирай 📚 Базу знаний
Задача: 1031. Maximum Sum of Two Non-Overlapping SubarraysСложность: mediumЕсли задан целочисленный массив nums и два целых числа firstLen и secondLen, верните максимальную сумму элементов в двух непересекающихся подмассивах с длинами firstLen и secondLen. Массив с длиной firstLen может находиться до или после массива с длиной secondLen, но они должны быть непересекающимися. Подмассив - это смежная часть массива.Пример:Input: nums = [0,6,5,2,2,5,1,9,4], firstLen = 1, secondLen = 2Output: 20👨💻 Алгоритм:1⃣Предварительные вычисления:Вычислите сумму всех подмассивов длины firstLen и secondLen и сохраните их в списках.2⃣Поиск максимальной суммы:Переберите все возможные позиции для подмассива длины firstLen и для каждого такого подмассива найдите максимальную сумму для подмассива длины secondLen, который не пересекается с текущим подмассивом длины firstLen.3⃣Сравнение двух случаев:Рассмотрите оба случая: подмассив длины firstLen до подмассива длины secondLen и подмассив длины secondLen до подмассива длины firstLen. Найдите максимальную сумму для каждого случая.😎 Решение:var maxSumTwoNoOverlap = function(nums, firstLen, secondLen) { return Math.max(maxSumNonOverlap(nums, firstLen, secondLen), maxSumNonOverlap(nums.reverse(), secondLen, firstLen));};function maxSumNonOverlap(nums, firstLen, secondLen) { const n = nums.length; const prefix = new Array(n + 1).fill(0); for (let i = 0; i < n; i++) { prefix[i + 1] = prefix[i] + nums[i]; } const maxFirst = new Array(n).fill(0); for (let i = firstLen - 1; i < n; i++) { maxFirst[i] = Math.max((i > 0 ? maxFirst[i - 1] : 0), prefix[i + 1] - prefix[i + 1 - firstLen]); } const maxSecond = new Array(n).fill(0); for (let i = secondLen - 1; i < n; i++) { maxSecond[i] = Math.max((i > 0 ? maxSecond[i - 1] : 0), prefix[i + 1] - prefix[i + 1 - secondLen]); } let maxSum = 0; for (let i = firstLen + secondLen - 1; i < n; i++) { maxSum = Math.max(maxSum, maxFirst[
Задача: 1278. Palindrome Partitioning IIIСложность: hard Вам дана строка s, содержащая строчные буквы, и целое число k. Вам нужно: Сначала заменить некоторые символы s на другие строчные английские буквы. Затем разделить s на k непустых непересекающихся подстрок так, чтобы каждая подстрока была палиндромом. Верните минимальное количество символов, которое нужно изменить, чтобы разделить строку.Пример:Input: s = "abc", k = 2Output: 1👨💻 Алгоритм:1⃣Используйте динамическое программирование для вычисления количества изменений, необходимых для превращения любой подстроки в палиндром.2⃣Используйте еще одно динамическое программирование для разбиения строки на k палиндромических подстрок с минимальным количеством изменений.3⃣Верните минимальное количество изменений, найденное во втором шаге.😎 Решение:var minChangesToMakePalindrome = function(s, k) { const n = s.length; const minChangeToPalindrome = (i, j) => { let changes = 0; while (i < j) { if (s[i] !== s[j]) { changes++; } i++; j--; } return changes; }; const dp1 = Array.from({ length: n }, () => Array(n).fill(0)); for (let length = 1; length <= n; length++) { for (let i = 0; i <= n - length; i++) { let j = i + length - 1; dp1[i][j] = minChangeToPalindrome(i, j); } } const dp2 = Array.from({ length: n + 1 }, () => Array(k + 1).fill(Infinity)); dp2[0][0] = 0; for (let i = 1; i <= n; i++) { for (let kk = 1; kk <= k; kk++) { for (let j = 0; j < i; j++) { dp2[i][kk] = Math.min(dp2[i][kk], dp2[j][kk - 1] + dp1[j][i - 1]); } } } return dp2[n][k];};Ставь 👍 и забирай 📚 Базу знаний
Задача: 901. Online Stock SpanСложность: mediumРазработайте алгоритм, который собирает ежедневные котировки цен на некоторые акции и возвращает размах цены этой акции за текущий день. Размах цены акции за один день - это максимальное количество дней подряд (начиная с этого дня и в обратном направлении), в течение которых цена акции была меньше или равна цене этого дня.Например, если цены акции за последние четыре дня равны [7,2,1,2], а цена акции сегодня равна 2, то размах сегодняшнего дня равен 4, поскольку, начиная с сегодняшнего дня, цена акции была меньше или равна 2 в течение 4 дней подряд.Также, если цена акции за последние четыре дня равна [7,34,1,2], а цена акции сегодня равна 8, то размах сегодняшнего дня равен 3, так как начиная с сегодняшнего дня цена акции была меньше или равна 8 в течение 3 дней подряд. Реализация класса StockSpanner: StockSpanner() Инициализирует объект класса. int next(int price) Возвращает размах цены акции, учитывая, что сегодняшняя цена равна price.Пример:Input["StockSpanner", "next", "next", "next", "next", "next", "next", "next"][[], [100], [80], [60], [70], [60], [75], [85]]Output[null, 1, 1, 1, 2, 1, 4, 6]👨💻 Алгоритм:1⃣Инициализировать стек для хранения пар значений (цена, размах) и переменную для текущего индекса.2⃣Для метода next:Установить начальный размах текущего дня равным 1.Пока стек не пуст и верхний элемент стека имеет цену меньше или равную текущей цене:Добавить размах верхнего элемента стека к текущему размаху.Удалить верхний элемент стека.3⃣Добавить текущую цену и размах на вершину стека.Вернуть текущий размах.😎 Решение:var StockSpanner = function() { this.stack = [];};StockSpanner.prototype.next = function(price) { let span = 1; while (this.stack.length && this.stack[this.stack.length - 1][0] <= price) { span += this.stack.pop()[1]; } this.stack.push([price, span]); return span;};Ставь 👍 и забирай 📚 Базу знаний

Задача: 470. Implement Rand10() Using Rand7()Сложность: mediumДано API rand7(), которое генерирует случайное целое число в диапазоне [1, 7]. Напишите функцию rand10(), которая генерирует случайное целое число в диапазоне [1, 10]. Вы можете вызывать только API rand7(), и не должны вызывать другие API. Пожалуйста, не используйте встроенные в язык функции для генерации случайных чисел.Каждый тестовый случай будет содержать один внутренний аргумент n, который указывает количество вызовов вашей реализованной функции rand10() во время тестирования. Обратите внимание, что это не аргумент, передаваемый в rand10().Пример:Input: n = 1Output: [2]😎 Решение:var rand10 = function() { let row, col, idx; do { row = rand7(); col = rand7(); idx = col + (row - 1) * 7; } while (idx > 40); return 1 + (idx - 1) % 10;};Ставь 👍 и забирай 📚 Базу знаний
Задача: 959. Regions Cut By SlashesСложность: mediumn x n сетка состоит из квадратов размером 1 x 1, где каждый квадрат 1 x 1 содержит '/', '', или пустое пространство ' '. Эти символы делят квадрат на смежные области.Дана сетка grid, представленная в виде строкового массива. Верните количество областей.Обратите внимание, что обратные слеши экранированы, поэтому '' представлен как '\'.Пример:Input: grid = [" /","/ "]Output: 2👨💻 Алгоритм:1⃣Создайте 4*N*N узлов для каждой ячейки сетки и соедините их в соответствии с описанием.2⃣Используйте структуру объединения-поиска (DSU), чтобы найти количество связанных компонентов.3⃣Пройдите по всем узлам и посчитайте количество корневых узлов, которые представляют количество областей.😎 Решение:class DSU { constructor(N) { this.parent = Array.from({ length: N }, (_, i) => i); } find(x) { if (this.parent[x] !== x) { this.parent[x] = this.find(this.parent[x]); } return this.parent[x]; } union(x, y) { this.parent[this.find(x)] = this.find(y); }}var regionsBySlashes = function(grid) { const N = grid.length; const dsu = new DSU(4 * N * N); for (let r = 0; r < N; r++) { for (let c = 0; c < N; c++) { const root = 4 * (r * N + c); const val = grid[r][c]; if (val !== '\\') { dsu.union(root + 0, root + 1); dsu.union(root + 2, root + 3); } if (val !== '/') { dsu.union(root + 0, root + 2); dsu.union(root + 1, root + 3); } if (r + 1 < N) { dsu.union(root + 3, (root + 4 * N) + 0); } if (r - 1 >= 0) { dsu.union(root + 0, (root - 4 * N) + 3); } if (c + 1 < N) { dsu.union(root + 2, (root + 4) + 1); } if (c - 1 >= 0) { dsu.union(root + 1, (root - 4) + 2); } } } let ans =
Задача: 722. Remove CommentsСложность: mediumДана программа на C++, удалите из нее комментарии. Исходный текст программы представляет собой массив строк source, где source[i] - это i-я строка исходного кода. Это результат разбиения исходной строки исходного кода символом новой строки '\n'. В C++ существует два типа комментариев: строчные и блочные. Строка "//" обозначает строчный комментарий, который означает, что он и остальные символы справа от него в той же строке должны игнорироваться. Строка "/*" обозначает блочный комментарий, который означает, что все символы до следующего (не перекрывающегося) вхождения "*/" должны игнорироваться. (Здесь вхождения происходят в порядке чтения: строка за строкой слева направо.) Чтобы было понятно, строка "/*/" еще не завершает блочный комментарий, так как окончание будет перекрывать начало. Первый эффективный комментарий имеет приоритет над остальными.Например, если строка "//" встречается в блочном комментарии, она игнорируется. Аналогично, если строка "/*" встречается в строчном или блочном комментарии, она также игнорируется. Если после удаления комментариев определенная строка кода оказывается пустой, вы не должны выводить эту строку: каждая строка в списке ответов будет непустой.Пример:Input: source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"]Output: ["int main()","{ "," ","int a, b, c;","a = b + c;","}"]👨💻 Алгоритм:1⃣Создайте строку buffer для хранения текущей строки кода без комментариев и флаг inBlock для отслеживания, находимся ли мы внутри блочного комментария.2⃣Пройдите по каждой строке source и по каждому символу в этой строке, обрабатывая комментарии: Если встречен блочный комментарий /*, установите флаг inBlock и пропустите символы до */. Если встречен строчный комментарий //, прекратите обработку текущей строки. Если не находимся внутри комментария, добавьте символ в buff