【Leetcode26 -刪除排序陣列中的重複項Remove Duplicates from Sorted Array】(c語言)
阿新 • • 發佈:2019-01-08
目錄
刪除排序陣列中的重複項
給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。
使用不要額外的陣列空間,必須你在原地修改輸入側陣列並在使用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]);
}
測試單元
首先我我們來寫測試單元(養成習慣)
建立一個排好序的陣列就如同例子說的那樣。這個函式的返回值是陣列的長度,列印時就按陣列返回的長度來列印
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nums[10] = { 0, 0, 1, 1, 1, 2, 2, 3, 3, 4 };
int numsSize = removeDuplicates(nums, 10);
for (int i = 0; i < numsSize; i++)
{
printf("%d ", nums[i]);
}
system("pause");
return 0;
}
題目分析:(雙指標法)
採用快慢指標的方法來遍歷陣列,慢指標從陣列的第二個元素開始進行遍歷,同時快陣列從陣列的陣列的頭到位進行遍歷,每當快慢陣列的值不一樣的時候將該值附在第一陣列(或已經判定為沒有重複陣列)的後面,並且數要返回的陣列的長度增加1,慢指標向後移動一位。反之,慢指標向後移動一位,其餘不變。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int removeDuplicates(int* nums, int numsSize)
{
assert("nums");//斷言防止傳空指標,發生錯誤。
int i = 0;
int k = 1;
if (numsSize <= 1)
{ //假如陣列長度小於等於1
return numsSize; //則返回它本身的索引值
}
int z = nums[0]; ///用第一個元素作為比較的元素和陣列後面的元素做比較
for (i = 0; i < numsSize; i++)//利用迴圈來遍歷陣列
{
if (z != nums[i])//如果找到大小不同(沒有重複)的元素
{
nums[k++] = nums[i];//把不同的元素的值從第二個元素開始一直向後賦值,並且陣列索引值k加1(無如何返回後陣列長度最小為1)
z = nums[i];//將當前的陣列元素設為下一次比較的元素
}
}
return k; //返回陣列中的元素個數k
}
int main()
{
int nums[10] = { 0, 0, 1, 1, 1, 2, 2, 3, 3, 4 };
int numsSize = removeDuplicates(nums, 10);
for (int i = 0; i < numsSize; i++)
{
printf("%d ", nums[i]);
}
system("pause");
return 0;
}