26. 洗掉有序陣列中的重復項
題目描述:給你一個有序陣列 nums ,請你 原地 洗掉重復出現的元素,使每個元素 只出現一次 ,回傳洗掉后陣列的新長度,
不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 并在使用 O(1) 額外空間的條件下完成,
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array

(重復元素若有兩個或以上原理相同)
代碼如下:
int removeDuplicates(int* nums, int numsSize)
{
if (numsSize == 0)
return 0;
int prev = 0, cur = 1, dst = 0;
while (cur < numsSize)
{
if (nums[prev] != nums[cur])
{
nums[dst] = nums[prev];
prev++;
cur++;
dst++;
}
else
{
prev++;
cur++;
}
}
//最后一個元素還沒有進行判斷
nums[dst] = nums[prev];
dst++;
prev++;
return dst;
}
- 還可以用指標形式,思路同上:兩個指標pr,ps,pr遍歷陣列,ps修改陣列元素,當*(pr + i) == (ps + 1 + i),即這兩個元素相同重復了,此后i++,在向后遍歷,直到(pr + i) != (ps + 1 + i),說明此時的兩個元素不同,而且此時的(pr+i)是多個重復元素里的最后一個(因為陣列有序),現在只要把這個元素賦值給*(ps + j)即可,
int removeDuplicates(int* nums, int numsSize)
{
if (numsSize == 0)
return 0;
if (numsSize == 1)
return 1;
//保證陣列起碼有兩個元素
int* pr = nums;
int* ps = nums;
int i = 0;
int j = 0;
for (i = 0; i+1 < numsSize ; i++)
{
if (*(pr + i) == *(ps + 1 + i))
{
;
}
else
{
*(ps + j) = *(pr + i);
j++;
}
}
*(ps + j) = *(pr + i);
j++;
return j;
}
如有錯誤歡迎指出,或提出你的解題思路或看法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/272509.html
標籤:其他
上一篇:原型和原型鏈的介紹和使用
下一篇:Thymeleaf模板入門(三)
