目录
第一种方法:暴力求解
遍历数组,从第i个元素开始看
从第i+1个元素开始与第i个元素进行比较,若相等则从第i+2个元素开始依次前移,并且数组长度减一,不相等则跳出比较
代码:
int removeDuplicates(int* nums, int numsSize){
if(numsSize==0||nums==NULL){//排除捣乱的数组
return 0;
}
for(int i=0;i<numsSize;i++){//对i到numsSize-1处的数组元素看一遍
for(int j=i+1;j<numsSize;j++){//从i+1处开始与i处的元素作比较
if(nums[j]==nums[i]){
for(int k=j;k<numsSize-1;k++){
//元素依次前移,k的取值是numsSize-1,因为要把k+1处的元素放到k处
nums[k]=nums[k+1];
}
--numsSize;//元素个数减一
}
else{
break;//结束第二个for循环
}
}
}
return numsSize;
}
第二种方法:双指针法
两个指针left和right分别指向第一个元素和第二个元素
若两个元素相等,则移动right++,
若两个元素不相等,则left++,然后将right处的值赋给left,right++
结束条件位right指向空
代码
int removeDuplicates(int* nums, int numsSize){
if(nums==NULL||numsSize==0){
return 0;
}
int* left=nums;
int* right=nums+1;
while(right){
if(*right==*left){
++left;
*left=*right;
++right;
}
else{
++right;
}
}
return left-nums;
}