剑指Offer 03. 数组中重复的数字
方法一 哈希表
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var findRepeatNumber = function(nums) { 6 let temp = new Array(100000); 7 for(let i = 0; i < nums.length; i++) { 8 if(temp[nums[i]]) { 9 return nums[i]; 10 } 11 temp[nums[i]] = 1; 12 } 13 return -1; 14 };
或者直接调用api
1 var findRepeatNumber = function(nums) { 2 let map = new Map(); 3 for(let i of nums){ 4 if(map.has(i)) return i; 5 map.set(i, 1); 6 } 7 return null; 8 };
方法二:原地交换
在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内
题中此条件代表数组元素的索引和值是一对多的关系。因此,可遍历数组并通过交换操作,使元素的索引与值一一对应。从而,能通过索引映射对应的值,起到与字典等价的作用。
其本质是将每个数组索引中放入与索引相同的值,若索引处的数值已是索引则说明有重复的数字了。

如果原本位置的数既是其对应的数,那么当找到这个位置时说明此时已经产生了重复元素,结果正确。
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var findRepeatNumber = function(nums) { 6 for(let i = 0; i < nums.length; ) { 7 if(nums[i] == i) { 8 i++; 9 continue; 10 } 11 if(nums[i] != nums[nums[i]]) { 12 let temp = nums[i]; 13 nums[i] = nums[nums[i]]; 14 nums[temp] = temp;//这里要用nums[temp],不能用temp[nums[i]] 15 }else { 16 return nums[i]; 17 } 18 } 19 return 0; 20 };

#
浙公网安备 33010602011771号