题目一:
时间复杂度O(n), 空间复杂度O(n)
#include <iostream>
using namespace std;
#define nullptr 0
bool duplicate(int numbers[], int len, int *duplication)
{
// 先判断输入是否合理
if(numbers == nullptr || len <= 0)
return false;
// 限定每个元素的大小在0 ~ n-1之间
for(int i = 0; i < len; i++)
if(numbers[i] < 0 || numbers[i] > len -1)
return false ;
for(int i = 0; i < len ;i++)
{
while(numbers[i] != i)
{
// 如果重复了
if(numbers[i] == numbers[numbers[i]])
{
*duplication = numbers[i];
return true;
}
// 交换numbers[i] numbers[numbers[i]]
int temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
}
}
return false ;
}
// 包含一个或多个重复的数字
void test1()
{
int a[] = {2, 3, 1, 0, 2, 5, 3};
int b ;
if(duplicate(a, sizeof(a)/ sizeof(int),&b))
cout << b << endl;
}
// 数组中不包含重复的数字
void test2()
{
int a[] = {1, 2, 3, 4, 5} ;
int b ;
if(duplicate(a, sizeof(a)/ sizeof(int),&b))
cout << b <<endl;
else
cout << "no duplication" <<endl;
}
// 无效的测试用例
void test3()
{
int *a = nullptr;
int b;
duplicate(a, 10, &b);
}
void test4()
{
int a[] = {-1, 2};
int b;
duplicate(a, sizeof(a)/ sizeof(int), &b);
}
int main()
{
test1();
test2();
test3();
test4();
}
题目二: