Найти тему
9 подписчиков

Насколько иногда вкаченные алгоритмические ребята думают не так, как я.

Решал сегодня задачку на leetcode на го, про удаление дубликатов из slice. Еще на курсе яндексе меня научили, что сначала хорошо бы решить в лоб, а потом уже оптимизировать и вот это вот все. Решаю:
func removeDuplicates(nums []int) int {
remove:=make([]int,0,1)
uniq :=1
for i:=1; i < len(nums); i++ {
if nums[i-1] == nums[i] {
remove = append(remove, i - len(remove))
}else{
uniq+=1
}
}
for _, val := range remove {
nums = append(nums[:val],nums[val+1:]...)
}
return uniq
}
Я по сути сначала нахожу дублирующиеся элементы, запоминаю их индексы (с учетом того, что при удалении каждого последующего индекс будет смещаться на велечину уже удаленных элементов) и затем пересобираю слайс.
А теперь взглянем на эталонное решение любителей leetcode:
func removeDuplicates(nums []int) int {
left := 1
for right := 1; right < len(nums); right++ {
if nums[right] != nums[right - 1] {
nums[left] = nums[right]
left++
}
}
return left
}
Чуваки прям в процессе переписывают slice, который читают. Кажется фанаты иммутабельного убивают в нас что-то оптимальное :D
Около минуты