Вычисление лексикографически следующей битовой перестановки
Дано число
Например, если задано 3 бита и текущее расположение битов:
то следующими будут:
*Функция
Дано число
v
, представляющее собой текущее расположение битов, и необходимо вычислить следующую лексикографическую перестановку битов с заданным количеством единиц. Например, если задано 3 бита и текущее расположение битов:
00010011
, то следующими будут:
00010101
, 00010110
, 00011001
, 00011010
, 00011100
, 00100011
и так далее.*Функция
__builtin_ctz(v)
компилятора GNU C для процессоров x86 возвращает количество замыкающих нулей. Для компиляторов Microsoft для x86 используется intrinsic _BitScanForward
. Обе функции генерируют инструкцию bsf
, но могут быть доступны эквиваленты для других архитектур. Если их нет, можно использовать один из методов подсчета подряд идущих нулевых битов.Повторяющееся целое число
Проблема: Дан целочисленный массив array. Необходимо реализовать алгоритм, который возвращает true, если какое-либо значение встречается в массиве более одного раза, в противном случае возвращается false.
Пример 1:
Input: nums = [1, 2, 3, 3]
Output: true
Пример 2:
Input: nums = [1, 2, 3, 4]
Output: false
Проблема: Дан целочисленный массив array. Необходимо реализовать алгоритм, который возвращает true, если какое-либо значение встречается в массиве более одного раза, в противном случае возвращается false.
Пример 1:
Input: nums = [1, 2, 3, 3]
Output: true
Пример 2:
Input: nums = [1, 2, 3, 4]
Output: false
Анаграмма
Проблема: Даны две строки s и t. Необходимо реализовать алгоритм, который возвращает true, если эти две строки являются анаграммами друг друга, в противном случае верните false.
Анаграмма — это строка, содержащая те же символы, что и другая строка, но порядок символов может быть другим.
Пример 1:
Input: s = "racecar", t = "carrace"
Output: true
Пример 2:
Input: s = "jar", t = "jam"
Output: false
Проблема: Даны две строки s и t. Необходимо реализовать алгоритм, который возвращает true, если эти две строки являются анаграммами друг друга, в противном случае верните false.
Анаграмма — это строка, содержащая те же символы, что и другая строка, но порядок символов может быть другим.
Пример 1:
Input: s = "racecar", t = "carrace"
Output: true
Пример 2:
Input: s = "jar", t = "jam"
Output: false
Два целых числа
Проблема: Дан массив целых чисел nums и целочисленный target. Необходимо реализовать алгоритм, который вернет индексы i и j такие, что nums[i] + nums[j] == target и i != j. Можно предположить, что каждый input имеет ровно одну пару индексов i и j, удовлетворяющих условию. Сначала верните ответ с меньшим индексом.
Пример 1:
Input: nums = [3,4,5,6], target = 7
Output: [0,1]
Пример 2:
Input: nums = [-3,4,3,90], target=0
Output: [0,2]
Проблема: Дан массив целых чисел nums и целочисленный target. Необходимо реализовать алгоритм, который вернет индексы i и j такие, что nums[i] + nums[j] == target и i != j. Можно предположить, что каждый input имеет ровно одну пару индексов i и j, удовлетворяющих условию. Сначала верните ответ с меньшим индексом.
Пример 1:
Input: nums = [3,4,5,6], target = 7
Output: [0,1]
Пример 2:
Input: nums = [-3,4,3,90], target=0
Output: [0,2]
Группы анаграмм
Проблема: Дан массив строк strs. Необходимо реализовать алгоритм, который сгруппирует все анаграммы в подгруппы. Можно вернуть вывод в любом порядке.
Анаграмма — это строка, содержащая те же символы, что и другая строка, но порядок символов может быть другим.
Пример 1:
Input: strs = ["act","pots","tops","cat","stop","hat"]
Output: [["hat"],["act", "cat"],["stop", "pots", "tops"]]
Пример 2:
Input: strs = ["x"]
Output: [["x"]]
Проблема: Дан массив строк strs. Необходимо реализовать алгоритм, который сгруппирует все анаграммы в подгруппы. Можно вернуть вывод в любом порядке.
Анаграмма — это строка, содержащая те же символы, что и другая строка, но порядок символов может быть другим.
Пример 1:
Input: strs = ["act","pots","tops","cat","stop","hat"]
Output: [["hat"],["act", "cat"],["stop", "pots", "tops"]]
Пример 2:
Input: strs = ["x"]
Output: [["x"]]
"K" элементов в списке
Проблема: Дан целочисленный массив nums и целое число k. Необходимо реализовать алгоритм, который вернет k наиболее часто встречающихся элементов массива. Можно вернуть вывод в любом порядке.
Пример 1:
Input: nums = [1,2,2,3,3,3], k = 2
Output: [2,3]
Пример 2:
Input: nums = [7,7], k = 1
Output: [7]
Проблема: Дан целочисленный массив nums и целое число k. Необходимо реализовать алгоритм, который вернет k наиболее часто встречающихся элементов массива. Можно вернуть вывод в любом порядке.
Пример 1:
Input: nums = [1,2,2,3,3,3], k = 2
Output: [2,3]
Пример 2:
Input: nums = [7,7], k = 1
Output: [7]
Произведения всех элементов массива, кроме текущего
Проблема: Дан целочисленный массив nums. Необходимо реализовать алгоритм, который вернет массив, где iый элемент является произведением всех элементов nums, кроме nums[i] (каждое произведение гарантированно умещается в 32-битное целое число).
Для решения задачи без использования операции деления и за O(n) времени, можно использовать метод предварительного вычисления произведений. Идея заключается в том, чтобы использовать два прохода по массиву: один для вычисления произведений слева от текущего элемента и другой для вычисления произведений справа от текущего элемента.
Пример:
Input: nums = [-1,0,1,2,3]
Output: [0,-6,0,0,0]
Проблема: Дан целочисленный массив nums. Необходимо реализовать алгоритм, который вернет массив, где iый элемент является произведением всех элементов nums, кроме nums[i] (каждое произведение гарантированно умещается в 32-битное целое число).
Для решения задачи без использования операции деления и за O(n) времени, можно использовать метод предварительного вычисления произведений. Идея заключается в том, чтобы использовать два прохода по массиву: один для вычисления произведений слева от текущего элемента и другой для вычисления произведений справа от текущего элемента.
Пример:
Input: nums = [-1,0,1,2,3]
Output: [0,-6,0,0,0]
Самая длинная последовательность
Проблема: Дан массив целых чисел nums. Необходимо реализовать алгоритм, который вернет длину самой длинной последовательности элементов.
Самая длинная последовательность — это последовательность элементов, в которой каждый элемент ровно на 1 больше предыдущего элемента.
Пример 1:
Input:
Output:
Пример 2:
Input:
Output:
Проблема: Дан массив целых чисел nums. Необходимо реализовать алгоритм, который вернет длину самой длинной последовательности элементов.
Самая длинная последовательность — это последовательность элементов, в которой каждый элемент ровно на 1 больше предыдущего элемента.
Пример 1:
Input:
nums = [2,20,4,10,3,4,5]
Output:
4
Пример 2:
Input:
nums = [0,3,2,5,4,6,1,1]
Output:
7
Сумма трёх целых чисел
Проблема: Дан целочисленный массив
Вывод не должен содержать повторяющихся троек. Можно вернуть результат и тройки в любом порядке.
Пример 1:
Input:
Output:
Объяснение:
Пример 2:
Input:
Output:
Проблема: Дан целочисленный массив
nums
. Необходимо реализовать алгоритм, который вернет все тройки [nums[i]
, nums[j]
, nums[k]]
, где nums[i] + nums[j] + nums[k] == 0
, и индексы i
, j
и k
различны. Вывод не должен содержать повторяющихся троек. Можно вернуть результат и тройки в любом порядке.
Пример 1:
Input:
nums = [-1,0,1,2,-1,-4]
Output:
[[-1,-1,2],[-1,0,1]]
Объяснение:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0
.nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0
.nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0
.Пример 2:
Input:
nums = [0,0,0]
Output:
[[0,0,0]]
Контейнер для воды
Проблема: Дан целочисленный массив
Можно выбрать любые две колонки, чтобы сформировать контейнер. В результате должно вернуться максимальное количество воды, которое может хранить контейнер.
Проблема: Дан целочисленный массив
heights
, где heights[i]
представляет высоту i
-ой колонки.Можно выбрать любые две колонки, чтобы сформировать контейнер. В результате должно вернуться максимальное количество воды, которое может хранить контейнер.
function maxArea(heights) {
left = 0
right = length(heights) - 1
max_area = 0
while left < right {
height = min(heights[left], heights[right])
width = right - left
current_area = height * width
max_area = max(max_area, current_area)
if heights[left] < heights[right] {
left += 1
}
else { right -= 1 }
}
return max_area
}
Покупка и продажа крипты
Проблема: Дан целочисленный массив цен, где prices[i] — цена AlgoCoin на i-й день. Можно выбрать один день для покупки одного AlgoCoin и выбрать другой день в будущем для его продажи.
В результате надо вывести максимальную прибыль, которую можно получить. Кроме того, есть возможность отказаться от совершения каких-либо транзакций, и в этом случае прибыль будет равна 0.
Пример 1:
Input: prices = [10,1,5,6,7,1]
Output: 6
Пояснение: купить за prices[1] и продать по prices[4]. В итоге, прибыль = 7 – 1 = 6.
Пример 2:
Input: prices = [10,8,7,5,2]
Output: 0
Пояснение: Невозможно совершить прибыльные сделки, поэтому максимальная прибыль равна 0.
Проблема: Дан целочисленный массив цен, где prices[i] — цена AlgoCoin на i-й день. Можно выбрать один день для покупки одного AlgoCoin и выбрать другой день в будущем для его продажи.
В результате надо вывести максимальную прибыль, которую можно получить. Кроме того, есть возможность отказаться от совершения каких-либо транзакций, и в этом случае прибыль будет равна 0.
Пример 1:
Input: prices = [10,1,5,6,7,1]
Output: 6
Пояснение: купить за prices[1] и продать по prices[4]. В итоге, прибыль = 7 – 1 = 6.
Пример 2:
Input: prices = [10,8,7,5,2]
Output: 0
Пояснение: Невозможно совершить прибыльные сделки, поэтому максимальная прибыль равна 0.
Проверка скобок
Проблема: Дана строка s, состоящая из следующих символов: '(', ')', '{', '}', '[' и ']'. Входная строка s действительна тогда и только тогда, когда:
- Каждая открытая скобка закрывается закрывающей скобкой одного и того же типа.
- Открытые скобки закрываются в правильном порядке.
- Каждой закрывающей скобке соответствует открытая скобка того же типа.
В результате надо вывести true, если s — допустимая строка, и false в противном случае.
Пример 1:
Input: s = "([{}])"
Output: true
Пример 2:
Input: s = "[(])"
Output: false
Проблема: Дана строка s, состоящая из следующих символов: '(', ')', '{', '}', '[' и ']'. Входная строка s действительна тогда и только тогда, когда:
- Каждая открытая скобка закрывается закрывающей скобкой одного и того же типа.
- Открытые скобки закрываются в правильном порядке.
- Каждой закрывающей скобке соответствует открытая скобка того же типа.
В результате надо вывести true, если s — допустимая строка, и false в противном случае.
Пример 1:
Input: s = "([{}])"
Output: true
Пример 2:
Input: s = "[(])"
Output: false
Обратная польская запись
Проблема: Дан массив строковых токенов, который представляет допустимое арифметическое выражение в обратной польской нотации. В результате возвращает целое число, представляющее оценку выражения.
Операнды могут быть целыми числами или результатами других операций. К операторам относятся «+», «-», «*» и «/». Предположим, что деление целых чисел всегда сокращается до нуля.
Пример:
Input: tokens = ["1","2","+","3","*","4","-"]
Output: 5
Объяснение: ((1 + 2) * 3) - 4 = 5
Проблема: Дан массив строковых токенов, который представляет допустимое арифметическое выражение в обратной польской нотации. В результате возвращает целое число, представляющее оценку выражения.
Операнды могут быть целыми числами или результатами других операций. К операторам относятся «+», «-», «*» и «/». Предположим, что деление целых чисел всегда сокращается до нуля.
Пример:
Input: tokens = ["1","2","+","3","*","4","-"]
Output: 5
Объяснение: ((1 + 2) * 3) - 4 = 5
Температура воздуха
Проблема: Дан массив целых чисел, где температура[i] представляет собой дневную температуру в i-й день.
Необходимо реализовать алгоритм, который возвращает результат массива, где result[i] — это количество дней после i-го дня до появления более высокой температуры в будущий день. Если в будущем не будет дня, когда в i-й день будет более высокая температура, вместо этого установите result[i] в 0.
Пример 1:
Input: temperatures = [30,38,30,36,35,40,28]
Output: [1,4,1,2,1,0,0]
Пример 2:
Input: temperatures = [22,21,20]
Output: [0,0,0]
Проблема: Дан массив целых чисел, где температура[i] представляет собой дневную температуру в i-й день.
Необходимо реализовать алгоритм, который возвращает результат массива, где result[i] — это количество дней после i-го дня до появления более высокой температуры в будущий день. Если в будущем не будет дня, когда в i-й день будет более высокая температура, вместо этого установите result[i] в 0.
Пример 1:
Input: temperatures = [30,38,30,36,35,40,28]
Output: [1,4,1,2,1,0,0]
Пример 2:
Input: temperatures = [22,21,20]
Output: [0,0,0]
Самый большой прямоугольник в гистограмме
Проблема: Дан массив целых чисел heights, где heights[i] представляет высоту столбца. Ширина каждого столбца равна 1.
Необходимо реализовать алгоритм, который возвращает площадь наибольшего прямоугольника, который может быть сформирован среди столбцов.
Проблема: Дан массив целых чисел heights, где heights[i] представляет высоту столбца. Ширина каждого столбца равна 1.
Необходимо реализовать алгоритм, который возвращает площадь наибольшего прямоугольника, который может быть сформирован среди столбцов.
function largestRectangleArea(heights) {
heights.append(0)
stack = empty stack
max_area = 0
for i from 0 to length(heights) - 1 {
while stack is not empty and
heights[i] < heights[stack.top()] {
height = heights[stack.pop()]
width = if stack is empty ? i : i - stack.top() - 1
max_area = max(max_area, height * width)
}
stack.push(i)
}
return max_area
}
Поиск в 2D-матрице
Проблема: Дана двумерная целочисленная матрица (matrix) размера m x n и число (target), которое надо найти в матрице. Каждая строка матрицы сортируется в порядке неубывания. Первое целое число каждой строки больше последнего целого числа предыдущей строки. Необходимо реализовать алгоритм, который возвращает true, если число найдено в матрице, или false в противном случае.
Пример:
Input:
Output:
Проблема: Дана двумерная целочисленная матрица (matrix) размера m x n и число (target), которое надо найти в матрице. Каждая строка матрицы сортируется в порядке неубывания. Первое целое число каждой строки больше последнего целого числа предыдущей строки. Необходимо реализовать алгоритм, который возвращает true, если число найдено в матрице, или false в противном случае.
Пример:
Input:
matrix = [[1,2,4,8],[10,11,12,13],[14,20,30,40]]
, target = 10
Output:
true
Поедание бананов
Проблема: Дан целочисленный массив
Необходимо установить норму потребления бананов в час, равную
Реализуемый алгоритм должен возвращать минимальное целое число
Пример 1:
Input:
Output: 2
Пример 2:
Input:
Output:
Проблема: Дан целочисленный массив
piles
, где piles[i]
— количество бананов в i
-й стопке. Вам также дано целое число h
, которое представляет собой количество часов, в течение которых вам нужно съесть все бананы.Необходимо установить норму потребления бананов в час, равную
k
. Каждый час вы можете выбрать стопку бананов и съесть k
бананов из этой стопки. Если в кучке меньше k
бананов, вы можете съесть эту кучу, но не сможете съесть другую кучу в тот же час.Реализуемый алгоритм должен возвращать минимальное целое число
k
такое, что вы сможете съесть все бананы за h
часов.Пример 1:
Input:
piles = [1,4,3,2]
, h = 9
Output: 2
Пример 2:
Input:
piles = [25,10,23,4]
, h = 4
Output:
25
Найти минимум в повернутом отсортированном массиве
Проблема: Дан массив длины
Обратим внимание, что поворот массива 4 раза перемещает последние четыре элемента массива в начало. Вращение массива 6 раз дает исходный массив.
Предполагая, что все элементы в повернутом отсортированном массиве уникальны, реализуемый алгоритм должен возвращать минимальный элемент этого массива. Решение, работающее за время
Пример 1:
Output:
Пример 2:
Output:
Проблема: Дан массив длины
n
, который изначально был отсортирован по возрастанию. Далее его поворачивали от 1
до n
раз. Например, массив nums = [1,2,3,4,5,6]
может выглядеть следующим образом:[3,4,5,6,1,2]
, если его повернули 4 раза.[1,2,3,4,5,6]
, если он был повернут 6 раз.Обратим внимание, что поворот массива 4 раза перемещает последние четыре элемента массива в начало. Вращение массива 6 раз дает исходный массив.
Предполагая, что все элементы в повернутом отсортированном массиве уникальны, реализуемый алгоритм должен возвращать минимальный элемент этого массива. Решение, работающее за время
O(n)
, тривиально, поэтому реализацию должна быть за время O(log n)
.Пример 1:
Input: nums = [3,4,5,6,1,2]
Output:
1
Пример 2:
Input: nums = [4,5,0,1,2,3]
Output:
0