2

在 Code Signal 上处理一些 Javascript 挑战,我在解决这个问题时遇到了问题:

Ratiorg 从 CodeMaster 那里得到了不同大小的雕像作为生日礼物,每个雕像都有一个非负整数大小。因为他喜欢把事情做得完美,所以他想把它们从小到大排列,这样每个雕像都会比前一个大一倍。他可能需要一些额外的雕像才能做到这一点。帮助他找出所需的最少额外雕像数量。示例 对于状态 = [6, 2, 3, 8],输出应为 makeArrayConsecutive2(statues) = 3。Ratiorg 需要大小为 4、5 和 7 的状态。

我的做法:

  • 将数组从小到大排序
  • 创建计数器变量以存储缺失数字的数量
  • 遍历数组
  • 从 [i] 元素中减去 [i + 1] 元素
  • 如果等于 1,数字是连续的,如果不是,数字是不连续的(增量计数器变量)
  • 返回计数器变量

这是我的代码:

function makeArrayConsecutive2(statues) {
    // Sorts array numerically smallest to largest
    statues.sort((a, b) => a - b);

    let counter = 0;

    // If array only contains one number return 0
    if(statues.length === 1) {
        return 0;
    }

    /* Iterate through array, subtract the current element from the next element, if it 
       equals 1 the numbers are consecutive, if it doesn't equal one increment the counter 
       variable */
    for(let i = 0; i <= statues.length -1; i++) {
        if(statues[i] !== statues.length -1 && statues[i + 1] - statues[i] != 1) {
           counter++;
        }

       console.log(statues[i]);
       console.log('counter : ' + counter);
    }

    return counter;       
}

statues包含[5, 4, 6]输出是这样的:

4
counter : 0
5
counter : 0
6
counter : 1

我认为问题是当数组位于最后一个元素上时,在本例中为 6,它试图查看statues[i + 1]该元素何时不存在。我添加statues[i] !== statues.length -1到我的 if 语句来解决这个问题,但它似乎没有工作。我的代码有什么问题,为什么最后一个元素会增加计数器变量?

4

1 回答 1

4

我会通过构建目标数组来接近它,该数组从输入的 min+1 到 max-1,不包括输入的成员.....

function missingConseq(input) {
  let min = Math.min.apply(null, input)
  let max = Math.max.apply(null, input)
  let result = []

  for (i = min+1; i < max; i++) {
    if (!input.includes(i)) result.push(i)
  }
  return result
}

let array = [6, 2, 3, 8]
console.log(missingConseq(array))

于 2019-10-23T02:12:31.963 回答