一、题目描述
给定一个有序数组,删除重复的地方,使每个元素只出现不多于两次,并返回新的长度。不要为其他数组分配额外的空间,您必须使用常量内存来完成此操作。
例如,给定输入数组A = [1,1,1,2,2,3],
你的函数应该返回length = 2,现在A是[1,1,2,2,3]。
二、解题思路
当第一次出现array[index]==array[i]的情况时,包容它能像array[index]!=array[i]的情况处理方式一样,如何能做到这点呢?
在程序里的体现就是flag
- 当flag<2,表示只包容这种情况出现一次
- 当flag<n,表示只包容这种情况出现n次
三、解题算法
/*************************************************
Author:tmw
date:2018-3-23
*************************************************/
#include <stdio.h>
#include <stdlib.h>
int Remove_Duplicates_remainLeast2(int* array, int len)
{
if( !array || len == 0 )
return 0;
int i;
int index=0;
int flag =0;
for( i=1; i<len; i++ )
{
/**
i指向元素最后一次出现的下一个位置;
index是元素第二次出现的位置
**/
if(array[i] != array[index])
{
array[++index] = array[i];
flag = 1;
}
else
{
/**改变flag值可以做功能扩展---删除重复项,保留设定重复的flag次**/
if(flag<2)
{
array[++index] = array[i];
flag++;
}
}
}
len = index+1;
/**打印数组**/
for(i=0;i<len;i++)
printf("%d ",array[i]);
printf("\n");
return len;
}
梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~