Назад к вопросам
Middle+
5
// Даны две отсортированных по неубыванию последовательности целых чисел. // Необходимо вернуть все элементы из первой последовательности, которых нет во второй. // 0 <= N <= 10^6 // -10^9 <= a[i] <= 10^9 // [1] // [2, 3, 4, 5, 6] // [1] // [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...] // [1] // [2, 3, 4, 5, 6, 7, 8] func filter(first []int, second []int) []int { res := make([]int, 0, len(first)) i, j := 0, 0 for i < len(first) && j < len(second) { if first[i] < second[j] { result = append(result, first[i]) i++ } else if first[i] > second[j] { j++ } else { i++ j++ } } for i < len(first) { result = append(result, first[i]) i++ } return result }
Компании, где спрашивали
Яндекс
Ответ от нейросети
sobes.tech AI
В представленном коде на Go есть ошибка: переменная result не объявлена, а используется res. Нужно использовать одну и ту же переменную.
Исправленный вариант функции, которая возвращает элементы из первой отсортированной последовательности, которых нет во второй:
func filter(first []int, second []int) []int {
res := make([]int, 0, len(first))
i, j := 0, 0
for i < len(first) && j < len(second) {
if first[i] < second[j] {
res = append(res, first[i])
i++
} else if first[i] > second[j] {
j++
} else {
i++
j++
}
}
for i < len(first) {
res = append(res, first[i])
i++
}
return res
}
Идея алгоритма:
- Используем два указателя
iиjдля обхода обеих последовательностей. - Если элемент из
firstменьше элемента изsecond, значит его нет во второй последовательности — добавляем в результат. - Если элемент из
firstбольше, двигаем указательjво второй последовательности. - Если равны — пропускаем оба.
- После окончания цикла добавляем оставшиеся элементы из
first.
Алгоритм работает за O(N), что эффективно для больших массивов.