假设我有一个数组,其中包含值 [1,2,3,6,7]。
如何检查数组是否包含 3 个连续的数字。例如,上面的数组包含 [1,2,3],因此这将在我的函数中返回 false。
var currentElement = null;
var counter = 0;
//check if the array contains 3 or more consecutive numbers:
for (var i = 0; i < bookedAppArray.length; i++) {
if ((bookedAppArray[i] != currentElement) && (bookedAppArray[i] === bookedAppArray[i - 1] + 1)) {
if (counter > 2) {
return true;
}
currentElement = bookedAppArray[i];
counter++;
} else {
counter = 1;
}
}
if(counter > 2){
return true;
} else{
return false;
}
这个解决方案
2
,1
1
function consecutive(array) {
var i = 2, d;
while (i < array.length) {
d = array[i - 1] - array[i - 2];
if (Math.abs(d) === 1 && d === array[i] - array[i - 1]) {
return false;
}
i++;
}
return true;
}
document.write(consecutive([1]) + '<br>'); // true
document.write(consecutive([2, 4, 6]) + '<br>'); // true
document.write(consecutive([9, 8, 7]) + '<br>'); // false
document.write(consecutive([1, 2, 3, 6, 7]) + '<br>'); // false
document.write(consecutive([1, 2, 3, 4, 5]) + '<br>'); // false
我最近需要做同样的事情,并想出了这个功能,如果有人认为它有用的话。
assert(!Array.prototype.isConsecutive, 'Array.isConsecutive rewriting conflict');
/**
* Check if array consist of consecutive numbers
* @param {number} [startFrom] If array should start from a specific number
* @returns {Boolean} true if array consist of consecutive numbers
*/
Array.prototype.isConsecutive = /** @lends Array */ function (startFrom) {
let curVal;
if (startFrom !== undefined) curVal = startFrom - 1;
// eslint-disable-next-line no-return-assign
return this.every((n) => (
!Number.isNaN(n)
&& (curVal = (curVal === undefined ? n : curVal + 1))
&& n === curVal)) || false;
};
如果数组是连续的,则返回
true
(这样更直观),如果需要反转,可以添加 !
。
以下是一些测试:
it('Array.isConsecutive', () => {
expect([1, 2, 3, 4].isConsecutive()).to.be.true;
expect([1, 2, 3, 4].isConsecutive(1)).to.be.true;
expect([5, 6, 7, 8].isConsecutive()).to.be.true;
expect([6, 5, 7, 8, 9].isConsecutive()).to.be.false;
expect([1, 2, 3, 4].isConsecutive(2)).to.be.false;
});
PS。我的示例中有一些 ani 模式(没有分配,没有原型内部函数)(我确信有些人会不喜欢我的答案),但我不在乎,如果你愿意,你可以将其转换为函数。
从逻辑上思考,这应该像迭代数组一样简单,只需检查当前索引之前的两个索引即可。
只需将
1
添加到前一个索引,并将 2
添加到该索引之前的索引,它们应该都相等,就像这样
function hasThree(arr) {
var res = false;
arr.forEach(function(item, index) {
var l1 = arr[index - 1], // get previous
l2 = arr[index - 2]; // get the one before the previous
if ( l1 && l2 ) { // if two previous exist
// add 1, and then 2, and see if all are equal
if ( item === l1 + 1 && item === l2 + 2 ) res = true;
}
});
return res;
}
有趣的问题。 这是我的尝试。
function cons(ar) {
var cnt = 0;
ar.forEach(function (i, idx) {
if (idx > 0) {
if (i == (ar[idx - 1] + 1)){
cnt++;
}
else {
if (cnt < 2)
cnt = 0;
}
}
});
return cnt < 2;
}
console.log('expected true', cons([1, 2, 5, 6, 9]));
console.log('expected false', cons([0, 2, 3, 4, 6, 9]));
console.log('expected false', cons([1, 2, 3, 4, 6, 9]));
这是一个。只需确保在执行之前对数组进行排序即可
function checkIfConsecutive(Arr) {
let isCnsc = true;
for (st in Arr ) {
if ( Arr[parseInt(st)+1]-Arr[parseInt(st)] > 1 && !isNaN(Arr[parseInt(st)+1]-Arr[parseInt(st)] )) {
isCnsc = false;
}
}
return isCnsc;
}
最初的方法可能是从输入数组中创建一个 Set ,以便排除重复的可能性,并且(排序后,如果相应的标志作为
true
传递)只需检查最后一项是否减去第一项构成数组的当前长度:
console.log(isValid([1, 2, 3, 4])); // => true
console.log(isValid([1, 2, 4])); // => false
console.log(isValid([5, 6, 7])); // => true
console.log(isValid([5, 5, 6])); // => false
console.log(isValid([6, 5, 4], true)); // => true
function isValid(arr, doSort = false) {
const uniqueSorted = [...new Set(arr)];
if (doSort) uniqueSorted.sort((a, b) => a - b);
const noDuplicates = uniqueSorted.length === arr.length;
const noGaps = uniqueSorted[uniqueSorted.length - 1] - uniqueSorted[0] === uniqueSorted.length - 1;
return noDuplicates && noGaps;
}
尝试使用
Array.prototype.some()
, Array.prototype.filter()
var arr1 = [1, 2, 3, 9, 8, 7];
var arr2 = [1, 2, "a", 3];
var check = function(a) {
// for each element in array `a`
return !a.some(function(item, index) {
// slice next three elements, including current element `item` from `a` array
var next = a.slice(index, 3);
console.log(next);
// if next three items in array `a` are type `Number`
// return `false`, else return `true`
return next.filter(Number).length === 3 ? true : false
})
};
// each item in `arr1` returns `false` , where item is followed
// by two numbers
// `arr2` returns `true` , where item is not followed by two numbers
console.log(check([1,2,3]), check(arr1), check(arr2)) // `false`, `false`, `true`
或者,使用
for
循环,Array.prototype.every()
var arr1 = [1, 2, 3, 9, 8, 7];
var arr2 = [1, 2, "a", 3];
var check = function(a) {
var res;
for (var i = 0; i < a.length; i++) {
// if `a[i]` is followed by two numbers, return `false`
if (a.slice(i, 3).every(function(n) {
return typeof n === "number"
})) {
res = false;
break;
}
// if `a[i]` is not followed by two numbers, return `true`
else {
res = true;
break;
}
}
return res
}
console.log(check([1,2,3]), check(arr1), check(arr2)) // `false`, `false` , `true`