您的位置:首页 > 职场人生

面试题3:数组中重复的数字

2017-06-01 22:21 232 查看
题目:在一个长度为n的数组里,所有数字都在0 - n-1范围内,数组中的某些数字是重复的,但不知道有几个重复的。请找出其中的任意一个重复数字。

举例:{2,3,1,0,2,5,3对应重复的数字为2或者3。

方法一,哈希表法:

bool duplicate(int numbers[], int length, int* duplication) {//duplicate重复
//与书上的解法不同 空间复杂度O(length) 时间复杂度为O(length)
vector<int > v;
v.resize(length);//确定容器大小
for(int i = 0; i < length; i++)
{
v[numbers[i]]++;
if(v[numbers[i]] >= 2)
{
*duplication = numbers[i];//
return true;
}
}
return false;
}方法二,下标交换:
bool duplicate(int numbers[], int length, int* duplication) {//duplicate重复
//时间复杂度O(n),空间复杂度O(1)
if(length <= 0 || numbers == nullptr)
return false;
for(int i = 0; i < length; ++i)
{
if(numbers[i] >= length || numbers[i] <= 0)
return false;
}

for(int i = 0; i < length; ++i)
{
while(i != numbers[i])
{
if(numbers[i] == numbers[numbers[i]])
{
*duplication = numbers[i];
return true;
}

int tmp = numbers[i];
numbers[i] = numbers[numbers[i]];
numbers[tmp] = tmp;//这里要注意 不是numbers[numbers[i]] 而是numbers[tmp]
}
}
return false;

}
      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: