Sobes.tech
Senior

Берилген массив сортталган жана ичинде дублдик элементтер бар. Алардын дублдиктерин жеринде (оригинал массивде) алып салуу керек жана алынган массивдин өлчөмүн кайтаруу керек. Мисал: Кирүү: nums = [0,0,1,1,1,2,2,3,3,4] Чыгуу: 5, nums = [0,1,2,3,4,_,_,_,_,_] Түшүндүрүү: Бул массивде 5 уникалдуу элемент бар. Алардын биринчи беш орунга жайгаштырыңыз жана 5 санын кайтарыңыз. Кийинки элементтер оригинал массивде каалаган болушу мүмкүн.

sobes.tech AI

AIден жооп

Тизмектеги такрорлорду жеринде жок кылуу үчүн эки көрсөткүчтү колдонсо болот: бири массив аркылуу өтүү үчүн, экинчиси уникалдуу элементтерди жазуу үчүн.

Идея:

  • writeIndexти 1ге коюңуз (биринчи уникалдуу элемент алда канча орунда).
  • readIndex менен массивди 1ден баштап акыркыга чейин өтүңүз.
  • Эгер учурдагы элемент алдыңкыдан айырмаланса, аны nums[writeIndex]ке жазып, writeIndexти көбөйтүңүз.

Акырында, writeIndex уникалдуу элементтердин санын көрсөтөт.

Go тилиндеги мисал:

func removeDuplicates(nums []int) int {
    if len(nums) == 0 {
        return 0
    }
    writeIndex := 1
    for readIndex := 1; readIndex < len(nums); readIndex++ {
        if nums[readIndex] != nums[readIndex-1] {
            nums[writeIndex] = nums[readIndex]
            writeIndex++
        }
    }
    return writeIndex
}

// Колдонуу:
// nums := []int{0,0,1,1,1,2,2,3,3,4}
// length := removeDuplicates(nums)
// fmt.Println(length) // 5
// fmt.Println(nums[:length]) // [0 1 2 3 4]