Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在前N个自然数的数组中查找缺失的1、2、3个数_Javascript_Arrays - Fatal编程技术网

Javascript 在前N个自然数的数组中查找缺失的1、2、3个数

Javascript 在前N个自然数的数组中查找缺失的1、2、3个数,javascript,arrays,Javascript,Arrays,假设数组已排序,如何在前N个自然数的数组中找到缺失的1、2和3个数 同样,假设数组已排序,下面的代码将用于返回一个缺少的值(由于return语句) 函数findmisingnumbers(数组){ 对于(var i=0;i!arr.includes(e)) } log(findmisingnumber([1,3,4,5,6,7]); log(findmisingnumber([10,16,8])您可以使用Array.prototype.reduce(),do..while循环 var miss

假设数组已排序,如何在前N个自然数的数组中找到缺失的1、2和3个数

同样,假设数组已排序,下面的代码将用于返回一个缺少的值(由于
return
语句)

函数findmisingnumbers(数组){
对于(var i=0;i
我看到过许多回答都是这样做的(找到一个缺失值),即取和和和期望值,然后通过从期望值中减去和来找到缺失值。然而,这也只能找到一个缺失值

我知道,如果使用I,这段代码将不起作用——如果arr[I]!=i+1,但同样,这只会返回第一个缺失值的正确值


您将如何处理此问题?

您需要在此处进行两项更改

  • 从函数返回数组,而不是在for循环的第一次迭代中返回数字
  • 创建一个新变量来跟踪那些丢失的数字
  • 以下是更新的代码段:

    function findMissingNumbers(array) {
        var resultsArray = [];
        var missedNumbers = 0;
    
        for (var i = 0; i < array.length; i++) {
            var expectedValue = i + 1 + missedNumbers;
    
            if (array[i] != expectedValue) {
                var segmentCountOfMissedNumbers = array[i] - expectedValue;
    
                for (var ii = 0; ii < segmentCountOfMissedNumbers; ii++) {
                    resultsArray.push(expectedValue + ii);
                }
                missedNumbers = missedNumbers + segmentCountOfMissedNumbers;
            }
        }
    
        if (resultsArray.length > 0) {
            return resultsArray;
        } else {
            return 'no missing numbers found';
        }
    }
    
    var missingArr = [3, 5, 9];
    console.log(findMissingNumbers(missingArr));
    
    函数findmisingnumbers(数组){
    var结果数组=[];
    var missedNumbers=0;
    对于(var i=0;i0){
    返回结果数组;
    }否则{
    返回“未找到丢失的号码”;
    }
    }
    var missingar=[3,5,9];
    日志(findmisingnumbers(missingar));
    
    查找数组中的最小值和最大值,使用
    array.from()从中创建数组。
    使用提供的数组筛选该数组以返回缺少的数字

    函数findmisingnumbers(arr){
    var min=数学最小值(…arr);
    var max=数学最大值(…arr);
    var all=Array.from(数组(max-min+1),(e,i)=>i+min)
    返回所有.filter(e=>!arr.includes(e))
    }
    log(findmisingnumber([1,3,4,5,6,7]);
    
    log(findmisingnumber([10,16,8])
    您可以使用
    Array.prototype.reduce()
    do..while
    循环

    var missingar=[1,3,4,5,6,7,9];
    var-res=[];
    缺失减少(功能(a,b){
    VarI=a+1;
    如果(i!==b){
    做{
    res.push(i++)
    }而(i控制台日志(res)还有一个应该可以工作的实现。就时间复杂度而言,它应该是
    O(n)

    函数findmisingnumbers(数组){
    var missingNumbers=[];
    var endInteger=array[array.length-1];
    var missingNumberCounter=0;
    对于(变量i=0;i您可以使用

    函数*findmisingnumbers(数组){
    变量编号=新集合(数组),
    i=1;
    while(数字、大小){
    如果(编号has(i)){
    删除(i);
    }否则{
    产量一;
    }
    i++;
    }
    }
    log([…findminingnumber([1,3,4,5,6,7]));
    log([…findmisingnumbers([6,7]));
    log([…findminingnumber([1,2,3,4,5,6,7]))
    
    .as控制台包装{max height:100%!important;top:0;}
    这里是一个(其他)非ES6解决方案。内部循环可能会被修改,不需要排序作为下一行的最后一行

    不管内部循环是什么,最坏情况下,它应该在O(n)x2范围内运行,相对于一个以1和数组的最大值为边界的数组——内部循环只运行一次,以找到多个“间隙”

    也许循环没有我的那么优雅,但另一方面,我的循环的优点是除了返回的数组之外,不引入任何变量

    function findMissingNumbers(array) {
        var missingNumbers = [];
    
        for (var i=0, n=array.length; i<n; i++) {
            if (array[i] > (i + 1 + missingNumbers.length)) {
                for (j=1, k = array[i] - (i + 1 + missingNumbers.length); j<=k; j++) {
                    missingNumbers.push(array[i] - j);
                }
            }
        }
    
        missingNumbers.sort();
        return missingNumbers;
    }
    
    var missingArr = [1, 4, 5, 6, 7, 9];
    console.log(findMissingNumbers(missingArr).join(",")); //2,3,8
    
    函数findmisingnumbers(数组){
    var missingNumbers=[];
    for(变量i=0,n=array.length;i(i+1+missingNumbers.length)){
    
    对于(j=1,k=array[i]-(i+1+missingNumbers.length);jn您可以将返回类型更改为array并重新考虑您的条件,我认为您就在这里,假设它是自然数的排序数组;a[i]=我暗示我们没有遇到任何一个丢失的数字。为了使这个优化,我会考虑二进制搜索,找到第一次A[i]!= i在那里识别丢失的数字,然后继续搜索(你需要改变你的搜索标准,因为[i]之间的不同)。我会根据您在数组中的位置而有所不同)。使用b搜索可以使您不必检查每一项。对于您明确的问题-我只需更改返回类型为什么将缺少的自然数推送到数组中只“返回第一个值的正确值”?这到底是什么意思?如果你有一个以“4”开头的数组,你的结果中是否有1、2和3?此解决方案假设数组的两个条目之间只能缺少一个数字。[1,2,5]只报告一个
    function findMissingNumbers(array) {
        var missingNumbers = [];
    
        for (var i=0, n=array.length; i<n; i++) {
            if (array[i] > (i + 1 + missingNumbers.length)) {
                for (j=1, k = array[i] - (i + 1 + missingNumbers.length); j<=k; j++) {
                    missingNumbers.push(array[i] - j);
                }
            }
        }
    
        missingNumbers.sort();
        return missingNumbers;
    }
    
    var missingArr = [1, 4, 5, 6, 7, 9];
    console.log(findMissingNumbers(missingArr).join(",")); //2,3,8