【问题描述】
给定一个长度为N的数组A=[A1,A2,…AN],数组中有可能有重复出现的整数。在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2、A3、…、AN。当修改Ai时,小明会检查Ai是否在A1~ Ai-1中出现过。如果出现过,则小明会给Ai加上1,如果新的Ai仍在之前出现过,小明会持续给Ai加1,直到Ai没有在A1~Ai-1中出现过。当AN也经过上述修改之后,显然A数组中就没有重复的整数了。现在给定初始的A数组,请你计算出最终的A数组。
【源代码】
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int num[100000];
int length;
void fun(int num[]){
int *flag = (int *)malloc(sizeof(int)*1000000);//哈希表
memset(flag,0,sizeof(int)*1000000);//清空表
int length;
int no_zero;
printf(" 修改数字 \n");
printf(" \n");
printf("请输入数组长度:");
scanf("%d",&length);
printf("请输入数组中的值:") ;
for(int i = 0;i < length;i++){
scanf("%d",&num[i]);
}
for(int i = 0;i < length;i++){
flag[num[i]]++;//更新表中元素即数字出现的次数
if(flag[num[i]]>1){//更新数组 查找表中最近没有出现的元素,no_zero表示最近没有出现的数
for(no_zero = 1;flag[no_zero]!=0;no_zero++){
;
}
num[i]=no_zero;
flag[num[i]]++;//更新表中元素即数字出现的次数
}
}
printf("最终数组为:");
for(int i = 0;i<length;i++){
printf("%d ",num[i]);
}
printf("\n");
}
int main(){
fun(num);
return 0;
}
【运行结果】