Другие языки программирования и технологии

Решите срочно не с инета на Go

Что общего
Ограничение времени 60 секунд
Ограничение памяти 1.5 Гб
Ввод стандартный ввод или main.go
Вывод стандартный вывод
Гоша и его друг Роб поспорили, что общего у них больше, чем отличий. Чтобы проверить, они вывалили содержимое рюкзаков на пол и стали считать предметы, которые есть в обоих рюкзаках. Вам вываливать ничего не нужно, нужно только написать функцию, которая находит пересечение двух слайсов.

Напишите функцию IntersectionOfSlices(slice1, slice2 []int) []int, которая получает два слайса из целочисленных элементов и возвращает слайс с элементами, которые встречаются в обоих.

(Не забудьте про пакет main).

Примечания
Например, если передать функции IntersectionOfSlices(slice1, slice2 []int) []int слайсы [1 2 3 4] и [1 2], то она должна вернуть слайс [1 2], а если передать слайсы [1 2 3 4] и [0], то слайс [].
Что поделать, если решение из интернета вполне разумно. Но если хочешь другой способ решения задачи, то для Go 1.21:
 package main
import "slices"
func IntersectionOfSlices(s1, s2 []int) (result []int) {
slices.Sort(s1)
slices.Sort(s2)
for i1, i2 := 0, 0; i1 < len(s1) && i2 < len(s2); {
if s1[i1] == s2[i2] {
result = append(result, s1[i1])
i1++
i2++
} else if s1[i1] < s2[i2] {
i1++
} else {
i2++
}
}
return
}
Сортируем срезы, а потом производим слияние (похожее на MergeSort), но не с объединением двух срезов, а с добавлением в результат только совпадающих значений.

Если у тебя Go 1.20 или более древний, то поменяется сортировка:
 package main
import "sort"
func IntersectionOfSlices(s1, s2 []int) (result []int) {
sort.Ints(s1)
sort.Ints(s2)
for i1, i2 := 0, 0; i1 < len(s1) && i2 < len(s2); {
if s1[i1] == s2[i2] {
result = append(result, s1[i1])
i1++
i2++
} else if s1[i1] < s2[i2] {
i1++
} else {
i2++
}
}
return
}
ДК
Денис Ковалёв
67 942
Лучший ответ
package main

import (
"fmt"
)

func IntersectionOfSlices(slice1, slice2 []int) []int {
// Создаем мапу для хранения элементов из slice1
elementMap := make(map[int]bool)

// Создаем слайс для результата
result := []int{}

// Заполняем мапу элементами из slice1
for _, elem := range slice1 {
elementMap[elem] = true
}

// Проверяем элементы из slice2 на наличие в мапе
for _, elem := range slice2 {
if elementMap[elem] {
result = append(result, elem)
}
}

return result
}

func main() {
slice1 := []int{1, 2, 3, 4}
slice2 := []int{1, 2}

result := IntersectionOfSlices(slice1, slice2)

fmt.Println(result) // Выводит [1 2]
}
Сергей Фролов Чел это с инета