43、数组中重复的数字。
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
数据范围:0≤n≤10000
进阶:时间复杂度O(n) ,空间复杂度O(n)
示例1
输入:
[2,3,1,0,2,5,3]
返回值:
2
说明:2或3都是对的
思路
本算法的思路是先将得到的内容放入数组中,然后对数组进行修改,遍历数组的时候得到最大值和最小值,瑞国超出范围则跳出,利用桶的思想来得到不是一次输入的数字,得到第一个就可以输出。
具体实现
# include<stdio.h>
# include <stdlib.h>
# include <string.h>
#define MAX_LEN 1000
int main() {
char str[MAX_LEN];
int num[MAX_LEN], index[MAX_LEN]={0};
int n,i,j=0;
// 将输入的内容按照字符串读入
scanf("%s", str);
// 读取字符串中不含‘[’‘]’的内容
for (i = 0; str[i] != ']'; i++) {
if (str[i] != ']') {
str[j++] = str[i];
}
}
str[j] = '\0'; // 确保新字符串以 '\0' 结尾
// 分割字符串并转换为数字
i=0;
char *token = strtok(str, ",");
int max=0, min=0;
while (token != NULL) {
num[i] = atoi(token);
if(num[i] > max)
max = num[i];
if(num[i] < min)
min = num[i];
index[num[i]]+=1;
i++;
token = strtok(NULL, ",");
}
if(max >= i || min < 0)
return -1;
for(j=0;j<i;j++){
if(index[j] > 1){
printf("%d", j);
break;
}
}
return 0;
}
小结
本次算法不是很难,主要是使用了数组来对数据进行处理。