Оглавление статьи
- Вводная часть
- Максимальный элемент в массиве
- Второй максимальный и минимальный элемент
- Проверить отсортирован ли массив
- Удаление дубликатов из массива
- Повернуть массив влево на одну позицию
- Повернуть массив влево на N позиций
- Повернуть массив вправо на N позиций
- Переместить нули в конец массива
- Линейный поиск
- Объединение двух отсортированных массивов
- Пересечение двух отсортированных массивов
- Поиск пропущенного числа
- Максимальная последовательность в массиве
- Число с одним повторением
- Самый длинный подмассив с сумой k
- Повторения в массиве
- Поиск числа с большим и меньшим повторением
- Поиск двух чисел
- Сортироватьмассив с тремя числами
- Количество повторений числа
- Максимальная сумма подмассива
- Покупка продажа акции
- Чередование положительных и отрицательных чисел
- Лидирующие числа
- Самая длинная последовательность
- Подсчет подмассивов с заданной суммой
Вводная часть
Массивы - это фундаментальная структура данных в программировании, которая позволяет хранить и организовывать множество элементов одного типа в одной переменной. В этой статье мы рассмотрим решения базовых задач с массивом данных.
Максимальный элемент в массиве
Решение задачи с нахождением максимального элемента в массиве.
Например: [3,2,1,5,2] => 5
const arr = [3,2,1,5,2]
let max = arr[0]
for (let i = 0; i < arr.length; i++) {
if (arr[i] > max) max = arr[i]
}
// Максимальный элемент: 5
console.log('Максимальный элемент:', max)
Второй максимальный и минимальный элемент
Решение задачи с нахождением второго по счету максимального и минимального элемента в массиве.
Например: [4,5,33,1,8,9,9,6,9,0] => [0,1], [33,9]
const arr = [4,5,33,1,8,9,9,6,9,0]
const min = secondMin(arr)
const max = secondMax(arr)
// Минимальный: [0,1]
console.log('Минимальный:', min)
// Максимальный: [33,9]
console.log('Максимальный:', max)
function secondMin(arr) {
let min = arr[0]
let smin = arr[1]
for (let i = 2; i < arr.length; i++) {
if (arr[i] < min) {
smin = min
min = arr[i]
} else if (arr[i] !== min && arr[i] < smin) {
smin = arr[i]
}
}
return [min, smin]
}
function secondMax(arr) {
let max = arr[0]
let smax = arr[1]
for (let i = 2; i < arr.length; i++) {
if (arr[i] > max) {
smax = max
max = arr[i]
} else if (arr[i] !== max && arr[i] > smax) {
smax = arr[i]
}
}
return [max, smax]
}
Проверить отсортирован ли массив
Решение задачи с проверкой массива на отсортированность элементов.
Например: [1,2,3,4,5,6,7,8] => true
const sort = [1,2,3,4,5,6,7,8]
const notSort = [1,2,5,3,6,4,8,7]
// true
console.log('Отсортированный массив:', isSort(sort))
// false
console.log('Не отсортированный массив:', isSort(notSort))
function isSort(arr) {
for (let i = 1; i < arr.length; i++) {
if (arr[i] < arr[i - 1]) {
return false
}
}
return true
}
Удаление дубликатов из отсортированного массива
Решение задачи с удалением дубликатов из массива.
Например: [1,1,2,3,4,4,5,6,7,8] => [1,2,3,4,5,6,7,8]
const arr = [1,1,2,3,4,4,5,6,7,8]
const uniq = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] !== uniq[uniq.length - 1]) {
uniq.push(arr[i])
}
}
// Уникальные числа: [1,2,3,4,5,6,7,8]
console.log('Уникальные числа:', uniq)
Повернуть массив влево на одну позицию
Решение задачи с поворотом массива на одну позицию влево.
Например: [1,2,3,4,5] => [2,3,4,5,1]
const arr = [1,2,3,4,5]
for (let i = 0; i < arr.length - 1; i++) {
const tmp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = tmp
}
// Повернутый массив: [2,3,4,5,1]
console.log('Повернутый массив:', arr)
Повернуть массив влево на N позиций
Решение задачи с поворотом массива на N позицию влево.
Например: [1,2,3,4,5] 4 => [2,3,4,5,1]
let n = 4
const arr = [1,2,3,4,5]
while (n > 0) {
for (let i = 0; i < arr.length - 1; i++) {
const tmp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = tmp
}
n--
}
// Повернутый массив: [5,1,2,3,4]
console.log('Повернутый массив:', arr)
Повернуть массив вправо на N позиций
Решение задачи с поворотом массива на N позиций вправо.
Например: [1,2,3,4,5] 4 => [2,3,4,5,1]
const arr = [1, 2, 3, 4, 5];
const n = 4;
const shiftedArr = [];
for (let i = 0; i < arr.length; i++) {
const newIndex = (i + n) % arr.length
shiftedArr[newIndex] = arr[i]
}
// Повернутый массив: [2,3,4,5,1]
console.log('Повернутый массив:', shiftedArr)
Переместить нули в конец массива
Решение задачи с перемещением нулей в конец массива.
Например: [0, 1, 0, 2, 3, 2, 0, 0, 4, 5, 1, 0] => [1,2,3,2,4,5,1,0,0,0,0,0]
const arr = [0, 1, 0, 2, 3, 2, 0, 0, 4, 5, 1, 0]
const tmp = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] !== 0) {
tmp.push(arr[i])
}
}
let end = arr.length - tmp.length
for (let i = 0; i < end; i++) {
tmp.push(0)
}
// Исходный массив: [0, 1, 0, 2, 3, 2, 0, 0, 4, 5, 1, 0]
console.log('Исходный массив:', arr)
// Новый массив: [1,2,3,2,4,5,1,0,0,0,0,0]
console.log('Новый массив', tmp)
Линейный поиск
Решение задачи с линейным поиском элемента в массиве.
Например: [1,6,7,3,8,2,4,0,5] 3 => 3
const search = 3
const arr = [1,6,7,3,8,2,4,0,5]
let position = -1
for (let i = 0; i < arr.length; i++) {
if (arr[i] === search) {
position = i
break
}
}
console.log('Позиция найденного элемента:', position)
console.log('Найденный элемент:', arr[position])
Объединение двух отсортированных множеств
Решение задачи с объединением двух отсортированных множеств.
Например: [1,1,2,3,4,5,9] [2,3,4,4,5,6] => [1,2,3,4,5,9,6]
const arr1 = [1,1,2,3,4,5,9]
const arr2 = [2,3,4,4,5,6]
const union = new Set()
for (let i = 0; i < arr1.length; i++) {
union.add(arr1[i])
}
for (let i = 0; i < arr2.length; i++) {
union.add(arr2[i])
}
const res = []
for (let item of union) {
res.push(item)
}
// Объединенное множество: [1,2,3,4,5,9,6]
console.log('Объединенное множество:', res)
Пересечение двух отсортированных массивов
Решение задачи с пересечением двух отсортированных массивов.
Например: [1,2,2,3,3,4,5,6] [2,3,3,5,6,6,7] => [2,3,3,5,6]
const arr1 = [1,2,2,3,3,4,5,6]
const arr2 = [2,3,3,5,6,6,7]
const visit = Array(Math.max(arr1.length, arr2.length)).fill(0)
const res = []
for (let i = 0; i < arr1.length; i++) {
for (let j = 0; j < arr2.length; j++) {
if (arr2[j] > arr1[i]) {
break
}
if (arr1[i] === arr2[j] && visit[j] === 0) {
res.push(arr1[i])
visit[j] = 1
break
}
}
}
// Пересеченный массив: [2,3,3,5,6]
console.log('Пересеченный массив:', res)
Вариант 2
const arr1 = [1,2,2,3,3,4,5,6]
const arr2 = [2,3,3,5,6,6,7]
let i = 0
let j = 0
const res = []
while (i < arr1.length && j < arr2.length) {
if (arr1[i] < arr2[j]) {
i++
} else if (arr2[j] < arr1[i]) {
j++
} else {
res.push(arr1[i])
i++
j++
}
}
// Пересеченный массив: [2,3,3,5,6]
console.log('Пересеченный массив:', res)
Поиск пропущенного числа
Решение задачи с поиском пропущенного числа.
Например: [1,2,3,4,5,7,8,10] => 6, 9
const arr = [1,2,3,4,5,7,8,10]
let res = []
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] + 1 !== arr[i + 1]) {
res.push(arr[i] + 1)
}
}
// Пропущенное число: [6, 9]
console.log('Пропущенное число:', res)
Вариант 2
const arr = [1,2,3,4,5,6,7,8,10]
let xor1 = 0
let xor2 = 0
for (let i = 0; i < arr.length - 1; i++) {
xor1 = xor1 ^ arr[i]
xor2 = xor2 ^ (i + 1)
}
xor1 = xor1 ^ arr.length - 1
const res = xor1 ^ xor2
// Пропущенное число: 9
console.log('Пропущенное число:', res)
Максимальная последовательность в массиве
Решение задачи с поиском максимальной последовательностью в массиве.
Например: [1,1,0,1,1,1,0,1,1] => 3
const arr = [1,1,0,1,1,1,0,1,1]
let count = 0
let max = 0
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 1) {
count++
max = Math.max(max, count)
} else {
count = 0
}
}
// Максимальное число повторений: 3
console.log('Максимальное число повторений:', max)
Число с одним повторением
Решение задачи с поиском числа с одним повторением.
Например: [1,1,2,3,3,4,4] => 2
let arr = [1,1,2,3,3,4,4]
let xorr = 0
for (let i = 0; i < arr.length; i++) {
xorr ^= arr[i]
}
// Число с одним повторением: 2
console.log('Число с одним повторением:', xorr)
Самый длинный подмассив с сумой k
Решение задачи с поиском самого длинного подмассива с сумой k.
Например: [1,2,1,4,1,1,1,1,2,1,1,0,4] 3 => [1,1,1]
const k = 3
const arr = [1,2,1,4,1,1,1,1,2,1,1,0,4]
const pos = Array(2).fill(0)
for (let i = 0; i < arr.length; i++) {
let sum = arr[i]
for (let j = i + 1; j < arr.length; j++) {
sum += arr[j]
if (sum === k && pos[1] < j - i + 1) {
pos[0] = i
pos[1] = j + 1
break
}
}
}
// Самый длинный подмассив: [1,1,1]
console.log(arr.slice(pos[0], pos[1]))
Повторения в массиве
Рассмотрим решение задачи на подсчет повторяющихся элементов в массиве.
Например: [10,5,10,15,10,5] => [[10,3],[5,2],[15,1]]
const arr = [10,5,10,15,10,5]
// Число/повторы: [[10,3],[5,2],[15,1]]
console.log('Число/повторы:', countFreq(arr))
function countFreq(arr) {
const res = []
let visited = []
for (let i = 0; i < arr.length; i++) {
if (visited[i] == true) continue
let count = 0
for (let j = i; j < arr.length; j++) {
if (arr[i] == arr[j]) {
visited[j] = true
count++
}
}
res.push([arr[i], count])
}
return res
}
Поиск числа с большим и меньшим повторением
Рассмотрим решение задачи на нахождение числа с большим и меньшим повторением в массиве.
Например: [10,5,10,15,10,5] => [10, 15]
let arr = [10, 5, 10, 15, 10, 5]
// Больше/меньше повторений: [10, 15]
console.log('Больше/меньше повторений:', countFreq(arr))
function countFreq(arr) {
let visited = []
let maxFreq = 0
let minFreq = arr.length
let maxEle = 0
let minEle = 0
for (let i = 0; i < arr.length; i++) {
if (visited[i] == true) continue
let count = 0
for (let j = i; j < arr.length; j++) {
if (arr[i] == arr[j]) {
visited[j] = true;
count++;
}
}
if (count > maxFreq) {
maxEle = arr[i];
maxFreq = count;
}
if (count < minFreq) {
minEle = arr[i];
minFreq = count;
}
}
return [maxEle, minEle]
}
Поиск двух чисел
Рассмотрим решение задачи на нахождение двух чисел сумма которых равна заданному числу.
Например: [6,8,12,1,4,5,10] 18 => [6,12]
const target = 18
const arr = [6,8,12,1,4,5,10]
let map = new Map()
let res = []
for (let i = 0; i < arr.length; i++) {
const search = target - arr[i]
map.set(search, arr[i])
if (map.has(arr[i])) {
res = [map.get(arr[i]), arr[i]]
break
}
}
// Сумма двух чисел: [6,12]
console.log('Сумма двух чисел:', res)
Вариант 2
const target = 18
const arr = [6,8,12,1,4,5,10]
let left = 0
let right = arr.length -1
let res = []
arr.sort((a, b) => a - b)
while (left < right) {
let sum = arr[left] + arr[right]
if (sum === target) {
res = [arr[left], arr[right]]
break
} else if (sum < target) {
left++
} else {
right--
}
}
// Сумма двух чисел: [6,12]
console.log('Сумма двух чисел:', res)
Сортировать массив с тремя числами
Рассмотрим решение задачи на сортировку массива с тремя числами.
Например: [0,1,2,0,1,2,1,2,0,0,0,1] => [0,0,0,0,0,1,1,1,1,2,2,2]
const arr = [0,1,2,0,1,2,1,2,0,0,0,1]
const res = []
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length; j++) {
if (arr[j] === i) {
res.push(arr[j])
}
}
}
// Отсортированный массив: [0,0,0,0,0,1,1,1,1,2,2,2]
console.log('Отсортированный массив:', res)
Вариант 2
const arr = [0,1,2,0,1,2,1,2,0,0,0,1]
let low = 0
let mid = 0
let high = arr.length - 1
while (mid <= high) {
if (arr[mid] === 0) {
const temp = arr[low]
arr[low] = arr[mid]
arr[mid] = temp
low++
mid++
}
else if (arr[mid] === 1) {
mid++
}
else {
const temp = arr[mid]
arr[mid] = arr[high]
arr[high] = temp
high--
}
}
// Отсортированный массив: [0,0,0,0,0,1,1,1,1,2,2,2]
console.log('Отсортированный массив:', arr)
Количество повторений числа
Рассмотрим решение задачи на поиск числа которое повторяется больше чем длина массива в два раза.
Например: [7,7,5,7,5,1,5,7,5,5,7,7,5,5,5,5] => 5
const arr = [7,7,5,7,5,1,5,7,5,5,7,7,5,5,5,5]
let count = 0
let el = null
for (let i = 0; i < arr.length; i++) {
if (count === 0) {
count = 1
el = arr[i]
}
else if (arr[i] === el) {
count++
}
else {
count--
}
}
count = 0
for (let item of arr) {
if (item === el) count++
}
if (count <= arr.length / 2) {
el = -1
}
// Наибольшее число: 5
console.log('Наибольшее число:', el)
Максимальная сумма подмассива
Рассмотрим решение задачи на поиск максимальной суммы подмассива.
Например: [-2,1,-3,4,-1,2,1,-5,4] => 6
const arr = [-2,1,-3,4,-1,2,1,-5,4]
let max = 0
for (let i = 0; i < arr.length; i++) {
let sum = arr[i]
for (let j = i + 1; j < arr.length; j++) {
sum += arr[j]
if (sum > max) {
max = sum
}
}
}
// Максимальная сумма подмассива: 6
console.log('Максимальная сумма подмассива:', max)
Вариант 2
const arr = [-2,1,-3,4,-1,2,1,-5,4]
let sum = 0
let max = 0
for (let item of arr) {
sum += item
max = Math.max(sum, max)
if (sum < 0) {
sum = 0
}
}
console.log(max)
// Максимальная сумма подмассива: 6
console.log('Максимальная сумма подмассива:', max)
Покупка продажа акции
Рассмотрим решение задачи на нахождение максимальной прибыли от покупки и продажи акции.
Например: [7,1,5,3,6,4] => 5
const arr = [7,1,5,3,6,4]
let sell = 0
let buy = 0
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] - arr[i] > arr[buy] - arr[sell]) {
sell = i
buy = j
}
}
}
// Купил: 1
// Продал: 6
// Максимальная прибыль: 5
console.log('Купил:', arr[sell])
console.log('Продал:', arr[buy])
console.log('Максимальная прибыль:', arr[buy] - arr[sell])
Чередование положительных и отрицательных чисел
Рассмотрим решение задачи на формирование массива в котором положительные числа чередуются с отрицательными.
Например: [3,1,-2,-5,2,-4,3,6,7,8,9] => [3,-2,1,-5,2,-4,3,6,7]
const arr = [3,1,-2,-5,2,-4,3,6,7,8,9]
const minus = []
const plus = []
const res = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] < 0) {
minus.push(arr[i])
} else {
plus.push(arr[i])
}
}
for (let i = 0; i < Math.ceil(arr.length / 2); i++) {
if (plus[i]) res[2 * i] = plus[i]
if (minus[i]) res[2 * i + 1] = minus[i]
}
// Чередующиеся числа: [3,-2,1,-5,2,-4,3,6,7]
console.log('Чередующиеся числа:', res.filter(item => item))
Вариант 2
const arr = [3,1,-2,-5,2,-4,3, 6,7,8,9]
let posIndex = 0
let negIndex = 1
const res = Array(arr.length).fill(0)
for (let i = 0; i < arr.length; i++) {
if (arr[i] < 0) {
res[negIndex] = arr[i]
negIndex += 2
} else {
res[posIndex] = arr[i]
posIndex += 2
}
}
// Чередующиеся числа: [3,-2,1,-5,2,-4,3,6,7]
console.log('Чередующиеся числа:', res.filter(item => item))
Лидирующие числа
Рассмотрим решение задачи на поиск чисел которые больше всех элементов в его правой части массива.
Например: [10,22,12,3,0,6] => [22,12,6]
const arr = [10,22,12,3,0,6]
const res = []
for(let i = 0; i < arr.length; i++) {
let leader = true
for(let j = i + 1; j < arr.length; j++) {
if (arr[i] < arr[j]) {
leader = false
break
}
}
if (leader) res.push(arr[i])
}
// Лидирующие числа: [22,12,6]
console.log('Лидирующие числа:', res)
Самая длинная последовательность
Рассмотрим решение задачи на поиск самой длинной последовательности чисел в массиве.
Например: [102,4,100,1,101,3,2,1,1,5] => 5
let arr = [102,4,100,1,101,3,2,1,1,5]
let res = 0
let max = 1
arr.sort((a, b) => a - b)
arr = [... new Set(arr)]
for(let i = 0; i < arr.length - 1; i++) {
if (arr[i] + 1 === arr[i + 1]) {
max += 1
} else {
res = Math.max(res, max)
max = 1
}
}
// Самая длинная последовательность: 5
console.log('Самая длинная последовательность:', res)
Подсчет подмассивов с заданной суммой
Рассмотрим решение задачи на подсчет количества подмассивов равное заданной сумме.
Например: [1,2,2,3,-3,1,1,1,4,2,-3] 3 => 7
const arr = [1,2,2,3,-3,1,1,1,4,2,-3]
const k = 3
let count = 0
for (let i = 0; i < arr.length; i++) {
let sum = 0
for (let j = i; j < arr.length; j++) {
sum += arr[j]
if (sum === k) count++
}
}
// Количество подмассивов: 7
console.log('Количество подмассивов:', count)