【描述】
进一步处理“删除重复项”:如果最多允许重复两次怎么办?
例如,给定排序数组A=[1, 1, 1, 2, 2, 3];
函数应该返回length = 5,现在A是[1, 1, 2, 2, 3]
【分析】
1. 异常情况处理,数组长度不大于0;
2. 使用两个变量(index, num),一个变量(index)进行标记新数组下标,另一个变量(num)进行标记已出现重复次数;
3. 判断当前下标是否交换,交换情景如下:
情景一:当前下标数组值 不等于 index下标数组值,数组值替换,并且index++, num = 1;
情景二:当前下标数组值 等于 index下标数组值,num数量 小于limit限制值,数组值替换,index++,并且 num++;
情景三:当前下标数组值 等于 index下标数组值,num数量 不小于 limit限制值,num++;
注意:具体实现参考代码;
【代码实现】
注意:需要测试用例,评论留言;
//demo.h
int removeDuplicates_ex(int arr[], int len);
//demo.c
int removeDuplicates_ex(int arr[], int len)
{
int index = 0;
int num = 1;
if (len <= 0) {
return 0;
}
for (int ix = 1; ix < len; ix++) {
if (arr[ix] == arr[index]) {
if (num >= 2) {
num++;
}
else {
arr[++index] = arr[ix];
num++;
}
}
else {
num = 1;
arr[++index] = arr[ix];
}
}
return index + 1;
}
【代码优化】基于有序进行优化
//demo.c
int removeDuplicates_ex(int arr[], int len)
{
int index = 2;
if (len <= 2) {
return len;
}
for (int ix = 2; ix < len; ix++) {
if (arr[ix] != arr[index - 2]) {
if (arr[index++] = arr[ix]);
}
}
return index;
}