剑指offer(JavaScript)刷题记录01——数组中重复的数字

剑指 Offer 03. 数组中重复的数字

难度:简单

找出数组中重复的数字。


在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 

限制:

2 <= n <= 100000

解题思路:

我用了三种方法来解题:哈希表,排序查重,原数组上改动

这三种方法也是书上提到的,虽然书上是c++语言的,但是像这种算法题,解题思路都是相通的

JavaScript解法:

/**
 * @param {number[]} nums
 * @return {number}
 */
var findRepeatNumber = function(nums) {
    // 方法一:借助集合 时间100ms 内存45.5M
    // const map=new Set();
    // map.add(nums[0]);
    // for(let i=1;i<nums.length;i++){
    //     if(map.has(nums[i])){
    //         return nums[i];
    //     }else{
    //         map.add(nums[i]);
    //     }

    // }

    //方法二:空间复杂度为o(1), 在原数组上交换元素,使得每个index的值正好是元素值,若哪个元素值已经排好了,就返回
    //时间92ms 内存43.2M
    for(let i=0;i<nums.length;i++){
        if(i===nums[i]){
                       
        }else{
             if(nums[nums[i]]===nums[i]){
                return nums[i];
            }
            // console.log(nums[i]);
            let t=nums[i];
            
            nums[i]=nums[nums[i]];
            // console.log(nums[i])
            nums[t]=t;//这里会搞错,因为nums[i]的值已经变掉了,不能写nums[nums[i]]
            
            i--;
            
        }
        // console.log(nums)
    }
    //方法三:排序之后遍历一遍  时间116ms 内存44.1M
    // nums.sort((a,b)=>{
    //     return a-b;
    // });
    // for(let i=1;i<nums.length;i++){
    //     if(nums[i-1]===nums[i]){
    //         return nums[i];
    //     }
    // }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值