在按顺序递增的数组中查找缺少的某一个数字

该博客探讨了一个数组中缺失数字的查找问题。数组包含0-99的数字,除一个被随机移除外,其余保持递增排序。通过两种方法在JavaScript中解决此问题:一种是遍历数组,另一种利用首尾数字相加性质,减少遍历次数。作者邀请读者分享更高效的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目是这样的:

给出一个数组arr内容是0-99的数字,从中间随机取出一个数字x,剩下的数字在数组arr中递增排序,求:使用最优的方法从数组arr中找到随机取出的x是多少


下面写的是js语法形式


方法一:

这是最笨也是最普通的方法,时间复杂度为O(n),for循环整个数组,前后两两想减,如果为1说明不是要找的,如果是2说明是中间缺少一个数字的,然后当前i下标的数字+1就是去除来的数字x

var arr = [0,1,2,3,4,5,6,8,9]

var x=  searchNum1( arr );

console.log(x);

function searchNum1( arr ){

    if( arr.length <=0 )  return false;

    for ( var i= 0,len=arr.length;i<len;i++ ){

            if( arr[i+1] - arr[i] == 2 ){

                    return arr[i]+1;

            }
    }

}

结果是: 7


方法二:

优化的写法,利用首尾相加值相同的原理,减少for循环的循环次数,时间复杂度为O(n/2) , 当首尾相加的和不等于9时,说明这两个数字的附近有一个就是要找的数字x,然后分别往前和往后计算差值是否为1就可以确认x是多少了,另外这个方法要处理下中间的数字,由于长度是奇数,所以中间的数字是个独立的数字不会跟任何其他数字相加,所以单独处理下

var arr = [0,1,2,3,4,5,6,8,9]

var x=  searchNum( arr );

console.log(x);

function searchNum( arr ){

    if( arr.length <=0 )  return false;

    var middleI = Math.floor(arr.length/2);

    for ( var i= 0,len=arr.length;i<middleI;i++ ){

        if ( arr[middleI]-arr[middleI-1] > 1 ) {

            return arr[middleI]-1;

        } else if(  arr[middleI+1]-arr[middleI] > 1 ){

            return arr[middleI]+1;

        } else {
            if( arr[i] + arr[len-i-1] !== 9 ){

                if( arr[i]-arr[i-1] !== 1 ){

                    return arr[i]-1;

                } else if( arr[len-i] + arr[len-i-1] !== 1 ){

                    return arr[len-i-1]+1;
                }
                break;
            }
        }
    }

}


网友如果有更优的方法,欢迎吐槽评论共赏


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值