检查数组中的单个连续字符



我有一个数字数组,可以是10的值。 我需要创建一个函数来检测是否存在一个实例,其中存在连续1并且该实例之外不存在其他1,返回其他truefalse

因此,总结一下,以下是返回true约束的更清晰视图:

  1. 必须只有一组连续1
  2. 除了连续1的那一个实例之外,不得有其他1

测试用例:

[0, 0, 1, 1, 0, 0] true
[1, 0, 1, 0, 0, 0] false
[1, 0, 1, 1, 0, 0] false
[1, 1, 0, 1, 1, 0] false
[0, 1, 1, 1, 1, 0] true
[0, 0, 1, 1, 1, 1] true
function hasOneRun(arr) {
let switches = 0;
for (let i = 0; i < arr.length; i++) {
switches += arr[i] ^ arr[i-1];
if (switches > 2) return false;
}
return switches > 0;
}

计算从 0 切换到 1或从 1 切换到 0 的次数。 仅当值与前一个值更改时,arr[i] ^ arr[i-1]才为 1。如果最后switches是0,那么只有0,所以是假的。如果它大于 2,则它切换到 1,然后切换到 0,然后又切换回 1,因此运行次数太多。

这是一个有趣的单行:D

Math.ceil(arr.reduce((switches, val, i) => switches + (val ^ arr[i-1]))/2) === 1;

编辑:其他一些想法

const startOne = (el, i, arr) => el == 1 && arr[i-1] != 1;
const is1 = x => x === 1;
arr.filter(startOne).length == 1;
arr.findIndex(startOne) === arr.findLastIndex(startOne);
arr.slice(arr.findIndex(is1), arr.findLastIndex(is1)+1).every(is1)

/^0*1+0*$/.test(arr.join('')); // zero or more zeroes, one or more ones

或者,如果您将其视为一系列位...

function hasOneRun(x) {
while (!(x&1)) x >>= 1; // shift off trailing zeroes
return (x&(x+1)) === 0; // see if one less than power of 2 (all 1s)
}
console.log(hasOneRun(0b001111000));
console.log(hasOneRun(0b11000));
console.log(hasOneRun(0b1111));
console.log(hasOneRun(0b1110000111000));

你也可以通过把它当作一个字符串来解决这个问题,并在有任何零序列的地方拆分它:

const testCases = [
[[0, 0, 1, 1, 0, 0], true],
[[1, 0, 1, 0, 0, 0], false],
[[1, 0, 1, 1, 0, 0], false],
[[1, 1, 0, 1, 1, 0], false],
[[0, 1, 1, 1, 1, 0], true],
[[0, 0, 1, 1, 1, 1], true]
];
const f = a => a.join('').split(/0+/).filter(i=>i).length===1;
testCases.forEach(t=>console.log(f(t[0])===t[1] ? 'pass' : 'fail'));

相关内容

  • 没有找到相关文章

最新更新