题目来源于力扣–https://leetcode-cn.com/
初始代码,可根据自己的需求进行修改
#include<stdio.h>
int removeDuplicates(int *nums,int numsSize);
int main(){
// 初始化数组
int num[5] = {1,1,1,1,1};
int length = removeDuplicates(num,5);
// 打印数组长度
printf("%d\n",length);
// 遍历数组
for(int i=0;i<length;i++){
printf("%d ",num[i]);
}
return 0;
}
一、数组元素无序删除
int removeDuplicates(int *nums,int numsSize){
if(!nums||numsSize==0){
return 0;
}
int i = 0;
// 从头开始比较
for (i = 0; i < numsSize; i++) {
// 拿出下一个元素
for (int j = i + 1; j < numsSize; j ++) {
// 若两个元素相等,则从后往前依次覆盖前边的元素
if (nums[i] == nums[j]) {
for (int k = i; k < numsSize - 1; k ++) {
nums[k] = nums[k + 1];
}
// 数组长度减一
numsSize --;
// 防止删除元素后少比较一个位置
j = i;
}
}
}
return numsSize;
}
二、数组元素有序删除
//处理数组是有序的情况 双指针法
int removeDuplicates(int *nums,int numsSize){
if(!nums||numsSize==0){
return 0;
}
// j进行数组遍历 初始化为1
int j = 1;
/*
1.j与j-1的元素进行比较,如果j与j-1不相同,替换,i++,j++,
2.当遇到j与j-1的元素相同时,表示i这个位置的元素与j-1位置的元素是重复的,此时i不动,j++,重复1
*/
// i表示数组中重复元素位置,这个位置是可以替换的 ,初始化为1,i记录当前的位置,
int i = 1;
for(j;j<numsSize;j++){
// 两个元素不相等,i往后走
if(nums[j]!=nums[j-1]){
// 重复元素的位置被替换
nums[i] = nums[j];
// i往后走
i++;
}
}
// i的大小就是数组的大小
return i;
}