1. 程式人生 > >【Leetcode26 -刪除排序陣列中的重複項Remove Duplicates from Sorted Array】(c語言)

【Leetcode26 -刪除排序陣列中的重複項Remove Duplicates from Sorted Array】(c語言)

目錄

測試單元

刪除排序陣列中的重複項

給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。

使用不要額外的陣列空間,必須你在原地修改輸入側陣列並在使用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;
}