[蓝蓝计算机考研算法训练二期]-day29

191 阅读1分钟

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;
} 

image.png

小结

本次算法不是很难,主要是使用了数组来对数据进行处理。