面试题3. 数组中重复的数字 题目链接思路分析代码实现 题目链接 面试题3. 数组中重复的数字 思路分析 1 使用unordered_set 直接使用set对数据进行去重,每准备插入一个数据,就在set中寻找该数据,若已经遇到过,说明已经出现了重复,直接返回,若未查找到,说明是新值,将其插入set2 进行原地置换 题目中给出的额外信息有一个长度为n的数组,里面的数字范围都在0~n-1之间,意味着我们可以从这里出发,假如我们能够将每一个数字都放回到他的索引位置,例如2放到下标为2的位置,这样当我们以后再遇到2的时候,想要放回却发现下标为2的位置上已经有了,说明出现了重复。 所以问题转换成了如何将一个数放回本该出现的位置 其实现逻辑已经通过途中流程给出 代码实现 1使用unordered_set class Solution { public: int findRepeatNumber(vector<int>& nums) { unordered_set<int> set; for(int i = 0; i < nums.size(); ++i) { auto it = set.find(nums[i]); if( it != set.end()) { return nums[i]; break; } set.insert(nums[i]); } return -1; } }; 2 class Solution { public: int findRepeatNumber(vector<int>& nums) { int i = 0; while(i < nums.size()) { if(nums[i] == i) { i++; continue; } //走到这里说明该位置索引和该位置上数值不相同 if(nums[i] == nums[nums[i]]) return nums[i]; else swap(nums[i], nums[nums[i]]); } return -1; } };