[蓝蓝计算机考研算法]-day29输出数组中重复的数字

17 阅读1分钟

题目描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。

例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1。数据范围:0≤n≤10000 。

进阶:时间复杂度O(n) ,空间复杂度O(n)

示例

输入:2 3 1 0 2 5 3
返回值:2
(说明:2或3都是对的)

思路

  1. 定义一个数组,将其中全部元素的值赋值为0。

  2. 将输入的数字作为下标存进数组中,即输入2,则下标为2的元素+1,这样就可以统计下标元素的个数。

  3. 用一个信号量flag=0判断,下标对应的元素是否大于1。循环遍历数组元素,当元素个数大于1时,表示出现了重复元素,flag置为1,输出下标,结束循环。

  4. 最后判断flag是否为0,为0则表示数组元素没有>1的,即数组元素不重复。

具体实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[100]={0},n=0,x,flag=0;
	while(cin>>x){
		a[x]++;
		if(cin.get()=='\n') break;
		n++; //计算数组长度 
	}
	for(int i=0; i<n; i++){
		if(a[i]>1){
			cout<<i;
			flag=1;
			break;	
		} 
	}
	if(flag==0) cout<<"没有重复元素";
	return 0;
}