給定一個排序數組伟恶,你需要在原地刪除重復出現的元素轿秧,使得每個元素只出現一次桥嗤,返回移除后數組的新長度。
不要使用額外的數組空間埂伦,你必須在原地修改輸入數組并在使用 O(1) 額外空間的條件下完成煞额。
示例?1:
給定數組nums=[1,1,2], 函數應該返回新的長度2, 并且原數組nums 的前兩個元素被修改為1,2。 你不需要考慮數組中超出新長度后面的元素沾谜。
示例?2:
給定 nums =[0,0,1,1,1,2,2,3,3,4],函數應該返回新的長度5, 并且原數組nums 的前五個元素被修改為0,1,2,3,4膊毁。你不需要考慮數組中超出新長度后面的元素。
說明:
為什么返回數值是整數基跑,但輸出的答案是數組呢?
請注意婚温,輸入數組是以“引用”方式傳遞的,這意味著在函數里修改輸入數組對于調用者是可見的媳否。
你可以想象內部操作如下:
//nums是以“引用”方式傳遞的栅螟。也就是說,不對實參做任何拷貝int len = removeDuplicates(nums);// 在函數里修改輸入數組對于調用者是可見的篱竭。// 根據你的函數返回的長度, 它會打印出數組中該長度范圍內的所有元素力图。for (int i = 0; i < len; i++) {? ? print(nums[i]);}
func removeDuplicates(nums []int) int {
????????if len(nums) ==0{//空數組,返回0
? ? ????????????? return 0
? ? ? ? }
????????size :=0? //標記非重復數字的位置
? ? ? ? ?for i,_ :=range nums? {
??????????//遍歷數組掺逼,與標記的非重復數字nums[size]比較吃媒,相等則說明沒有找到非重復數字,繼續(xù)遍歷,
? ? ? ? ?//不等則說明找到了非重復數字赘那,將標記位size右移1位刑桑,并將找到的非重復數字寫入nums[size]中
????????????????if nums[size] != nums[i] {?
????????????????????????size+=1
? ? ? ? ? ? ? ? ? ? ? ? nums[size] =nums[i]
????????????????}
????????}
????????nums = nums[0:size+1]? //go語言的slice特性:此時nums的len(nums) = size,cap(nums)不變?
????????return size +1
}