数组不擅长插入(添加)和删除元素。数组的优点在于它是连续的,所以查找数据速度很快。但这也是它的一个缺点。正因为它是连续的,所以当插入一个元素时,插入点后所有的元素全部都要向后移;而删除一个元素时,删除点后所有的元素全
删除有序数组中的重复项Ⅰ
a.思路
⭐定义变量 int dest=0,cur=1,nums[cur]与nums[dest]逐一比较。
⭐nums[cur]!=nums[dest],将nums[cur]放入dest下一个位置,更新dest。
⭐nums[cur]!=nums[dest],cur移动。
⭐cur==numsSize,结束。返回dest+1。
b.图解
c.代码
int removeDuplicates(int* nums, int numsSize)
{
if(numsSize==0)
{
return 0;
}
int dest=0;
int cur=1;
nums[dest]=nums[0];
//从cur==1 cur<numsSize
while(cur<numsSize)
{
if(nums[cur]!=nums[dest])
{
nums[++dest]=nums[cur++];
}
else
{
cur++;
}
}
return dest+1;
}
d.思考
⭐如果给你一个无序的数组,去除重复的元素,该如何设计程序?
删除有序数组中的重复项Ⅱ
a.思路
⭐定义变量 int dest=0,cur=1,flag=1(表示0到dest,nums[dest]只出现过一次)。
⭐比较nums[cur]与nums[dest]。
⭐nums[cur]!=nums[dest],将nums[cur]放入dest下一个位置,++dest,更新flag(flag=1)。
⭐nums[cur]==nums[dest],如果dest所对应的flag为1,可将nums[cur]放入dest下一个位置,++dest, ++flag。如果dest所对应的flag为2,只移动cur.。
b.图解
c.代码
int removeDuplicates(int* nums, int numsSize)
{
int dest=0;
int cur=1;
int flag=1;
nums[dest]=nums[0];
//从cur==1到cur<numsSize
while(cur<numsSize)
{
if(nums[cur]!=nums[dest])
{
nums[++dest]=nums[cur++];
flag=1;
}
else
{
if(flag==1)
{
nums[++dest]=nums[cur++];
++flag;
}
else
{
cur++;
}
}
}
return dest+1;
}
d.思考
⭐如果给定一个有序数组,删除重复出现的元素,使每个元素最多出现k次 ,返回删除后数组的新长度,该如何设计程序?(k为常数)
今天的算法题就分享到这里了,博主也会在后期更新更加优质的博文,如果对你有帮助的话,可以给个关注,顺便给个赞。
到此这篇关于C语言 详解如何删除有序数组中的重复项的文章就介绍到这了,更多相关C语言 有序数组内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:C语言 详解如何删除有序数组中的重复项


基础教程推荐
- C/C++编程中const的使用详解 2023-03-26
- 详解c# Emit技术 2023-03-25
- 如何C++使用模板特化功能 2023-03-05
- C利用语言实现数据结构之队列 2022-11-22
- 一文带你了解C++中的字符替换方法 2023-07-20
- C++中的atoi 函数简介 2023-01-05
- C语言 structural body结构体详解用法 2022-12-06
- C语言基础全局变量与局部变量教程详解 2022-12-31
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- C++详细实现完整图书管理功能 2023-04-04