剑指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 };

 

posted @ 2021-09-04 16:34  雪之下。  阅读(41)  评论(0)    收藏  举报