牛客网:WC148 数组中重复的数字
描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1。
输入:[2,3,1,0,2,5,3]
返回值:2
说明:2或3都是对的
解法一:先排序再查找
int duplicate(vector<int>& numbers) {
if(numbers.size()==0 || numbers.size()==1) return -1;
//排序查找
sort(numbers.begin(), numbers.end());
for(size_t i=0; i<numbers.size()-1;++i)
{
if(numbers[i]==numbers[i+1]) return numbers[i];
}
return -1;
}
解法二:使用set容器
int duplicate(vector<int>& numbers) {
// write code here
set<int> temp;
for(int i: numbers)
{
//如果该数字已经出现过了,则表示重复出现
if(temp.count(i)) return i;
//第一次出现,插入到容器
temp.insert(i);
}
return -1;
}
解法三:构建一个临时容器
int duplicate(vector<int>& numbers) {
vector<int> temp(numbers.size(), 0);
for(size_t i=0; i<numbers.size();++i)
{
//统计某个数字出现的次数
temp[numbers[i]]++;
//出现了2次
if(temp[numbers[i]] > 1) return numbers[i];
}
return -1;
}
解法四:在遍历的时候把数组numbers中的值放到对应的位置上
int duplicate(vector<int>& numbers) {
for (int i = 0; i < numbers.size(); i++)
//位置正确,没有相同的也是在这里退出的
if (i == numbers[i])
continue;
//出现了重复,直接返回
if (numbers[i] == numbers[numbers[i]])
return numbers[i];
//没有重复的,先交换位置再说
int temp = numbers[numbers[i]]
numbers[numbers[i]] = numbers[
numbers[i] = temp;
//从开头继续查找
i--;
}
return -1;
}