题目描述,对于给定的按照顺序排序的数组,删除其中重复的元素,并返回删除重复元素后的数组长度。
比如对于数组[1,1,1,2,2,2,3,3,3,4,4]删除重复元素后的长度为4
解体思路:设置双下标i、j,j初始化在i后面,当a[i]=a[j]时j++,一直到不相等的时候,将a[j]的值赋值给a[i+1],当j>=length的时候结束。
#include<stdio.h>
#include<stdlib.h>
int main(void){
int MAX = 10;//定义数组初始最大长度
int num,count = 0 ; //输入的数字,输入数字的计数
int *nums = (int*)malloc(MAX*sizeof(int));
int length = MAX; //数组初始长度(这里没有描述好,应该是最大可容纳长度)
int recount = 0; //记录去重后的数组有效长度
printf("请输入数组元素,输入-1表示结束(按照从小到大输入):");
int i = 0;
//进行输入
while(1){//建立数组
scanf("%d",&num);
if(num==-1){
break;
}
count++;
if(i<length){
nums[i] = num;
}else{
length += MAX;
nums = (int*)realloc(nums,length*sizeof(int));
nums[i] = num;
}
i++;
}
printf("数组长度为:%d\n",count);
for(int i=0;i<count;i++){
printf("%d ",nums[i]);
}printf("\n");
//开始去掉重复的元素,count是输入的数组长度
//定义新的数组长度
int new_length = 0;
//之所以1也要在这里进行判断,是因为如果进行下面的算法,如果j=1会出现数组越界
if(count==0||count==1){
new_length = count;
}else{
i = 0;
for(int j=1;j<count;j++){
if(nums[i]!=nums[j]){
nums[++i]=nums[j];
}
}
new_length = i+1;
}
printf("去重后的数组长度为%d,数组元素为:\n",new_length);
for(int i=0;i<new_length;i++){
printf("%d ",nums[i]);
}printf("\n");
return 0;
}
如有问题请各位大佬批评指出~