最近更新于 2024-05-05 14:19
题目
已知一个有序数组 nums,原地删除重复的元素,使每个元素只出现一次,返回 nums 最终的长度。
分析
题目有要求,是在提供的原数组上删除重的元素。但是 C 语言本身的数组是静态的,不能直接删除元素。那么这个题目可以考虑使用双指针算法解答。

测试环境
gcc 9.4.0 – 64位
-no-pie -std=c17 -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Werror=format-security -Wextra -pedantic -Wimplicit-fallthrough -Wsequence-point -Wswitch-unreachable -Wswitch-enum -Wstringop-truncation -Wbool-compare -Wtautological-compare -Wfloat-equal -Wshadow=global -Wpointer-arith -Wpointer-compare -Wcast-align -Wcast-qual -Wwrite-strings -Wdangling-else -Wlogical-op -Wconversion -g -O0 -lm
代码实现
#include <stdio.h>
int remove_duplicate(int *nums, int len)
{
int s = 0;
int f = 1;
while (f < len)
{
if (s == 0 && f == s + 1 && nums[s] != nums[f])
{
++s;
}
else if (nums[s] != nums[f])
{
++s;
nums[s] = nums[f];
}
else if (nums[s] == nums[f])
{
++f;
}
}
return s + 1;
}
int main()
{
int nums1[] = {1,1,3,5,6,7,8};
int nums2[] = {2,2,2,3,3,4,4,4,4,5,7,8,8,8,8};
int nums3[] = {1,2,2,2,3,5,6,7,7,7,7,8};
int nums4[] = {1,2,3,3,4,5};
int nums5[] = {1,2,3,5,6,7,7,7,9};
int nums6[] = {1,2,3,4,6,7,8};
int nums7[] = {1,1,1,3,3,3,5,5,5};
printf("%d\n", remove_duplicate(nums1, sizeof(nums1) / sizeof(int)));
printf("%d\n", remove_duplicate(nums2, sizeof(nums2) / sizeof(int)));
printf("%d\n", remove_duplicate(nums3, sizeof(nums3) / sizeof(int)));
printf("%d\n", remove_duplicate(nums4, sizeof(nums4) / sizeof(int)));
printf("%d\n", remove_duplicate(nums5, sizeof(nums5) / sizeof(int)));
printf("%d\n", remove_duplicate(nums6, sizeof(nums6) / sizeof(int)));
printf("%d\n", remove_duplicate(nums7, sizeof(nums7) / sizeof(int)));
}

删除有序数组中的重复项
