Leetcode -删除排序数组中的重复项(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;
}

猜你喜欢

转载自blog.csdn.net/SoYangA/article/details/81457431