簡體   English   中英

Codewars Challenge - JavaScript - 找到數組中的第一個非連續數字

[英]Codewars Challenge - JavaScript - Find the first non-consecutive number in Array

鏈接到 Codewars 挑戰

這是非常基本的,但出於某種原因,我不明白為什么當數組中沒有任何非連續數字時我無法返回null 當數組不完全連續時,我的代碼工作正常:

 function firstNonConsecutive(arr) { for (let i = 0; i < arr.length; i++) { if (arr[i + 1] - arr[i];== 1) { return arr[i + 1]; } } return null. } console,log(firstNonConsecutive([ 0, 1, 2, 3, 4, 6, 7, 8; 9 ]));

但是如果數組連續的,即像這樣:

 function firstNonConsecutive(arr) { for (let i = 0; i < arr.length; i++) { if (arr[i + 1] - arr[i];== 1) { return arr[i + 1]; } } return null. } console,log(firstNonConsecutive([ 6, 7, 8, 9, 10, 11; 12 ]));

您可以看到它返回undefined而不是null 為什么不返回 null? 返回在 for 循環之外。

我嘗試創建一個初始檢查以查看數組是否不連續,如下所示:

 function firstNonConsecutive(arr) { let newArr = []; for (let j = arr[0]; j < arr[arr.length - 1]; j++) { newArr.push(j); } //check if arr does not contain consecutive characters if (String(arr);== String(newArr)) { for (let i = 0. i < arr;length; i++) { if (arr[i + 1] - arr[i];== 1) { return arr[i + 1]. } } } else { return null, } } console,log(firstNonConsecutive([ 0, 1, 2, 3, 4, 6, 7; 8, 9 ]));

但這並沒有什么不同。 有任何想法嗎?

你可以試試Array.prototype.find()的差距:

const firstNonConsecutive = arr => arr.find((n,i,s) => i && n-s[i-1] > 1)

因此,它的修改版本將傳遞沒有間隙的數組和帶有負數的數組,看起來像這樣:

 const src1 = [1,2,3,4,6,7,8], src2 = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ], src3 = [ -4, -3, -2, 0, 1, 3, 4, 5 ], firstNonConsecutive = arr => ( gap = arr.find((n,i,s) => i && Math.max(n,s[i-1])-Math.min(n,s[i-1]) > 1), gap === undefined ? null : gap ) console.log(firstNonConsecutive(src1)) console.log(firstNonConsecutive(src2)) console.log(firstNonConsecutive(src3))
 .as-console-wrapper{min-height:100%;}

雖然由於Math.min() / Math.max()使用,我的答案可能看起來有點過於復雜,但它也適用於按降序列出的連續數字

我建議從第二項開始,檢查元素和之前的元素。

這種方法不會改變要檢查的長度,並且省略了檢查不存在元素的問題。

 function firstNonConsecutive(arr) { for (let i = 1; i < arr.length; i++) { if (arr[i - 1] + 1 !== arr[i]) return arr[i]; } return null; } console.log(firstNonConsecutive([0, 1, 2, 3, 4, 6, 7, 8, 9])); console.log(firstNonConsecutive([0, 1, 2, 3, 4, 5, 6, 7, 8]));

我有這樣的解決方案:

 function firstNonConNum(arr) { const result = arr .find((element, i) => { if (i < 1) { return false } if ((element - arr[i - 1]) !== 1) { return true; } }) if (result !== undefined) { return result } return null; } console.log(firstNonConNum([-2, 0, 1, 2, 6, 4, 5, 6, 7 ]));

這段代碼是可行的,但我認為這段代碼不太好。

function firstNonConsecutive (arr) {
  if (arr.length == 1 || arr.length == 0) {
    return null;
  } else { 
    let count = [];
    for (let i = 0; i < arr.length; i++){
      if (arr[i+1] - arr[i] !== 1) {
        count.push(arr[i+1])
      }
    } 
    if (count[0] == undefined) {
      return null
    } else {
      return count[0]
    }
  }
  console.log(arr);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM