[英]Codewars Challenge - JavaScript - Find the first non-consecutive number in Array
這是非常基本的,但出於某種原因,我不明白為什么當數組中沒有任何非連續數字時我無法返回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.