【问题标题】:Find lowest positive integer that does not appear in array查找未出现在数组中的最小正整数
【发布时间】:2021-11-29 07:10:55
【问题描述】:

我正在尝试解决一个 leetcode 类型问题,这是一个练习问题,伴随着即将到来的代码测试,我需要为一份工作而做,但我遇到了麻烦。谁能帮我理解出了什么问题?

我基本上是在寻找蛮力选项,因为我不知道算法/DS。

                                                       PROBLEM:

写一个函数:

函数解(A);

给定一个包含 N 个整数的数组 A,返回在 A 中没有出现的最小正整数(大于 0)。

例如,给定 A = [1, 3, 6, 4, 1, 2],函数应该返回 5。

给定 A = [1, 2, 3],函数应该返回 4。

给定 A = [−1, −3],函数应该返回 1。

为以下假设编写一个有效的算法:

N 是 [1..100,000] 范围内的整数; 数组 A 的每个元素都是 [−1,000,000..1,000,000] 范围内的整数。

                            HERE IS MY SOLUTION: 

function solution(A) {
    let newArray = A.sort(function(a, b){return a-b})
        let lowestNumber = 1
        for(i=0; i < newArray.length; i++) {
            if(lowestNumber > newArray[0]) {
                return lowestNumber
            }
            if(lowestNumber == newArray[i]) {
                lowestNumber = lowestNumber + 1
            }
            if(i = newArray.length - 1) {
                return lowestNumber
            }  
    }
}

下面的 sn-p 没有像我期望的那样工作。最低数字没有增加,我相信循环也在这里退出。

if(lowestNumber == newArray[i]) {
                lowestNumber = lowestNumber + 1

感谢您的帮助!

【问题讨论】:

  • 您是否尝试过使用浏览器开发工具调试器单步执行您的代码?

标签: javascript arrays for-loop


【解决方案1】:

一种方式:

  • 检查数组是否为空并返回1
  • 使用 Set 对数组进行排序并删除重复项
  • 如果数组的最后一个数小于 1,则返回 1
  • 遍历数组并返回第一个缺失的数字
  • 检查是否缺少号码,如果没有返回 last + 1

function findNum(arr) {
  if (!arr.length) return 1
  arr = [...new Set(arr.sort((a, b) => a - b))]
  if (arr[arr.length - 1] < 1) return 1
  else {
    for (let i = 1; i <= arr.length; i++) {
      if (arr.indexOf(i) == -1) {
        return i;
        break;
      }
    }
  }
  return arr[arr.length - 1] + 1
}
console.log(findNum([]))                // 1
console.log(findNum([-8, -3, -3, -6]))  // 1
console.log(findNum([1, 3, 6, 4, 1, 2]))// 5
console.log(findNum([1, 2, -4, 3, -3])) // 4

【讨论】:

  • 你应该解释你的海报代码
  • 它返回 1 而不是 3 for [-8, -3, -6, 1, 2]
  • @MikeM 啊,对不起,伙计,我的错,我想我纠正了它,干杯:)
【解决方案2】:

您可以使用Map()O(N) 中执行此操作:

  • 首先设置数组中的每个数字。
  • 然后从1开始寻找并返回序列中缺失的数字。

function solution(arr) {
  const seen = new Map();

  for (let i = 0; i < arr.length; i++) {
    seen.set(arr[i]);
  }

  for (let i = 1; i <= arr.length + 1; i++) {
    if (!seen.has(i)) return i;
  }

  return 1;
}

console.log(solution([1, 3, 6, 4, 1, 2])); //-> 5
console.log(solution([1, 2, 3]));          //-> 4
console.log(solution([-1, -3]));           //-> 1

【讨论】:

    【解决方案3】:

    我认为你的&gt; 应该是&lt;,而if(i = newArray.length - 1) 中的= 应该是===

    如果数组包含负数,lowestNumber &gt; newArray[0] 将始终为真,因此将返回 1

    你的努力似乎很粗心,所以你将不得不为面试做好准备。

    const integers = [5, -345, 562456, 95345, 4, 232, 1, 2, 3, 7, -457];
    
    function solution(A) {
      let newArray = A.sort((a, b) => a - b);
      let lowestNumber = 1;
      for (let i = 0; i < newArray.length; i++) {
        const n = newArray[i];
        if (n > 0) {
          if (lowestNumber < n) {
            return lowestNumber;
          } else {
            lowestNumber = n + 1;
          }
        }
      }
      return lowestNumber;
    }
    
    console.log(solution(integers));

    【讨论】:

      猜你喜欢
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2019-01-14
      相关资源
      最近更新 更多