哈希表
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
/*
解题思路:
用哈希表。遍历数组nums,nums中元素作为key值,出现次数作为value值,value值大于1时直接输出key值。
*/
unordered_map<int, int> mp; //构建哈希表
int len = nums.size(); //数组长度为len
for (int i = 0; i < len; i++) //遍历数组nums
{
mp[nums[i]]++; //将nums数组中元素作为哈希表中Key值填入mp中
if (mp[nums[i]] > 1)
return nums[i]; //如果Key值对应的Value值大于1,则说明该元素重复出现,返回该元素
}
return -1; //如果遍历一遍数组仍没有值返回,说明数组中每个元素均不重复,返回-1
}
};
交换下标
int findRepeatNumber(vector<int>& nums) {
/*
解题思路:
nums数组长度为n,且里面所有数字都在0~n-1范围内,因此我们只需要将遍历数组,然后将每一个数组元素与其值所对应数组下标元素互换。当发现当前元素与当前元素值对应的下标元素的值相同时,说明该元素重复,则返回该元素。
*/
int len = nums.size(); //数组长度为len
for (int i = 0; i < len; i++)
{
if (i != nums[i]) //如果当前元素值不等于其下标(如果相等则i自增)
{
if (nums[i] == nums[nums[i]]) //如果当前元素与其值所对应下表中元素值相等,则输出该元素
return nums[i];
swap(nums[i], nums[nums[i]]); //如果不相等,则交换当前元素与其值所对应下标中元素
}
}
return nums[len - 1]; //如果遍历一遍均未输出,则一定是以下情况:即前1~n-1个元素与下标对应,第n个元素为重复元素
}