【问题标题】:missing integers from a sorted array排序数组中缺少整数
【发布时间】:2023-03-14 05:22:02
【问题描述】:
  • 我有一个排序数字数组被传递到我的函数中
  • 我想返回我缺少的numbers的号码

示例:

我传递的数组是[1,5,6,9]

我缺少的数字是 2,3,4,7,8

计数器应该是 5

我正在尝试做的事情:

不使用任何内置插件。 虽然我列表中的下一个数字不是我列表中的下一个数字,但我会加一。


function missing(numbers){
    counter = 0;
    let j = 1;
    for(let i = 0; i<numbers.length; i++){
        while(numbers[i+1] != numbers[i]+j){
            j+=1;
            counter+=1;
            console.log("missing "+ numbers[i]+j)
        }
    }
return counter;
}

【问题讨论】:

    标签: javascript loops


    【解决方案1】:

    我建议使用Set 来包含输入数组中的所有数字,然后生成与该数组对应的所有可能数字的范围数组。

    我们首先获取输入数组的最小值和最大值,然后生成从最小值到最大值的范围。

    然后我们使用Array.filter() 来删除我们原始数组(在Set中)范围数组中的所有项

    function getMissingNumbers(arr) {
        const [min,max] = [Math.min(...arr), Math.max(...arr)];
        const range = Array.from({ length: (max - min + 1)}, (v,k) => k + min);
        const nSet = new Set(arr);
        return range.filter(n => !nSet.has(n));
    }
    
    console.log(getMissingNumbers([1,5,6,9]))
    console.log(getMissingNumbers([1,5]))
    console.log(getMissingNumbers([2,3,4,5,8,9]))
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    还有一个稍微简单的版本(假设数组已排序):

    function getMissingNumbers(arr) {
        let s = new Set(arr);
        let range = Array.from({ length: (arr[arr.length-1] - arr[0])}, (v,k) => k + arr[0]);
        return range.filter(n => !s.has(n));
    }
    
    console.log(getMissingNumbers([1,5,6,9]))
    console.log(getMissingNumbers([1,5]))
    console.log(getMissingNumbers([2,3,4,5,8,9]))
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 迭代次数过多。
    • 我添加了一个迭代次数更少的版本,尽管我认为如果我们谈论的是少数数字,无论如何运行时间都是一样的!
    【解决方案2】:

    您可以采用单循环并从索引零运行到给定数组的末尾。

    同时使用一个变量作为递增值,如果不在数组中,则将该值推送到缺失值的结果集中。

    function getMissing(array) {
        let i = 0,
            v = array[0],
            result = [];
        
        while (i < array.length) {
            if (v === array[i]) {
                i++;
                v++;
                continue;
            }
            result.push(v++);
        }
        return result;
    }
    
    
    console.log(...getMissing([1, 5, 6, 9])); // 2 3 4 7 8

    【讨论】:

      【解决方案3】:
      function missing(numbers){
          counter = 0;
        
          for(let i = 0; i<numbers.length; i++){
              let j = 1;
              while(numbers[i+1] != numbers[i]+j && numbers[i]+j < 10){
                  console.log(`missing + ${numbers[i]+j}`, numbers[i], j)
                  j+=1;
                  counter+=1;
              }
          }
          return counter;
      }
      

      你的逻辑有些问题。

      1. 首先,您预计会丢失 9 之前的数字,而您的 while 条件中缺少该数字。
      2. 退出 while 循环后,您不会重置 j 变量。
      3. 在 print 语句给你错误的值之前增加 j,这可能导致 while 条件失败。

      【讨论】:

        【解决方案4】:

        您也可以尝试在一个循环中使用 2 个循环

        function missingNumbers(arr) {
              const arr2 = [];
              for (let i = arr[0]; i <= arr[arr.length - 1]; i++) {
                arr2.push(i);
              }
              if (arr.length === arr2.length) {
                return [];
              }
              for (let i = 0; i < arr2.length; i++) {
                for (let j = 0; j < arr.length; j++) {
                  if (arr2[i] === arr[j]) {
                    arr2.splice(i, 1);
                  }
                }
              }
              return arr2;
            }
            
            console.log(missingNumbers([1,5,6,9]))
            console.log(missingNumbers([1,5]))
            console.log(missingNumbers([2,3,4,5,8,9]))
            console.log(missingNumbers([1,2]))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-01
          • 2011-07-09
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          • 2018-12-03
          相关资源
          最近更新 更多