题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
第一种思路:
简单的遍历,然后重复的数字累加;
个人观点:可能这个复杂度比较高,虽然我不会算,这是我看到这个题目首先就想到的,我一开始还以为这道题目简单,就想看看别人怎么做的,一看,自己的是最差劲的,怪尴尬的
#include<iostream>
using namespace std;
int main()
{
int count = 1;
int i = 0;
int arr[7] = { 2,3,1,0,2,5,3 };
for (i = 0; i < 7; i++)
{
for (int j = i + 1; j <= 7; j++)
{
if (arr[i] == arr[j])
{
count++;
}
}
if (count != 1)
{
cout << arr[i];
cout << "总共出现了:" << count << "次" << endl;
count = 1;
}
}
return 0;
}
第二种思路:修改原数组顺序
因为题目当中说:在一个长度为n的数组里的所有数字都在0到n-1的范围内,所以如果不重复的话,那就应该一个数字对应一个下标;可是如果重复了的话,同一个数字可能至少对应两个下标,当元素和下标不同的时候就交该元素的位置和以该元素为下标的元素的位置,直到元素和下标相等,以一定会遇到两个不同下标对应的元素相同,此时输出结果,即可输出第一个重复的元素
这是我查了一些网上的方法,根据自己的理解写的,然后就发现我想的果真太少都木有考虑各种不符合的情况
#include<iostream>
//#include<stdio.h>
using namespace std;
void Change(int &a, int &b);
int FindNum(int arr[], int size);
int FindNum(int arr[], int size)
{
int i;
if (arr == NULL || size <= 0)
{
return -1;
}
for (i = 0; i < size; i++)
{
if (arr[i] < 0 || arr[i] >= size)
return -1;
}
for (i = 0; i < size; i++)
{
while (arr[i]!=i)
{
if (arr[i] ==arr[arr[i]])
{
return arr[i];
}
else
{
Change(arr[i], arr[arr[i]]);
//cout << arr[i] <<" "<< arr[arr[i]] << endl;
}
}
}
return -1;
}
void Change(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int arr[7] = {2,3,1,0,2,5,3};
int result=FindNum(arr,7);
cout <<"重复的输出是:" <<result << endl;
return 0;
}
我再研究研究另外两种思路,然后再总结一下,加油