剑指offer——数组中重复的数字
数组中重复的数字
https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&&tqId=11203&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

我的代码都是参考了牛客网的题解的,可能有些没有改过,但是是我自己看懂了再打上来的,由于是新手,请大家多多包涵
解题思路:
方法1
in-place 方法
由题目可得,长度为n的的数组的所有数字都在0~n-1范围,总结,如果数组中没有重复的数字的话,那会有:值=下标索引,但是在数组中其值可能不等于下标索引,这个时候我们需要做的就是:(1)第一次遇到,将值与其对应的下标索引的值交换(2)第二次,如果再有交换操作那就说明找到重复数字
代码:
过程:
1.for循环:根据数组长度构建循环次数,i = 0,由数组索引作为循环因子
2.while循环:判断数组值是否和索引相等,如果不相等则进入循环,相等则开始比较下一个数字
3.if-else循环:判断的是当前数组值是否和数组的数组值相等,比如n[1]的值是是否和n[n[1]]相等,如果不相等,那就交换它们的位置,如果相等则找到了重复的数字。
class Solution {
public:
bool duplicate(int numbers[], int length, int* duplication) {
//构建一个序列,开始进行换位判断
for(int i=0;i<length;i++)
{
while(numbers[i]!=i)
{
if(numbers[i]!=numbers[numbers[i]])
swap(numbers[i],numbers[numbers[i]]);
else
{
*duplication = numbers[i];
return true;
}
}
}
return false;
}
};方法2:
哈希+遍历
1.建立一个哈希表,全部置为false,将第一次遇到的值置为true,如果再遇到true说明就找到了重复的值
class Solution {
public:
bool duplicate(int numbers[], int length, int* duplication) {
//新建哈希表
vector<bool> f(length, false);
//遍历
for (int i=0; i<length; ++i) {
if (!f[numbers[i]]) {
f[numbers[i]] = true;
}
//找到结果
else {
*duplication = numbers[i];
return true;
}
}
return false;
}
};
查看17道真题和解析