Javascript 寻找连续序列的MapReduce算法
我需要编写一个小的map/reduce函数,如果数组中至少有4个连续0,它应该返回1,否则它应该返回与1不同的值 例子: [6,7,5,0,0,0,0,3,4,0,0,1]=>1 [6,7,5,0,0,0,3,4,0,0,0,0,0,1]=>1 [5,0,0,0,3,4,0,0,0,8,0,0,0,1]=>某物#1 这是我的算法:Javascript 寻找连续序列的MapReduce算法,javascript,algorithm,mapreduce,Javascript,Algorithm,Mapreduce,我需要编写一个小的map/reduce函数,如果数组中至少有4个连续0,它应该返回1,否则它应该返回与1不同的值 例子: [6,7,5,0,0,0,0,3,4,0,0,1]=>1 [6,7,5,0,0,0,3,4,0,0,0,0,0,1]=>1 [5,0,0,0,3,4,0,0,0,8,0,0,0,1]=>某物#1 这是我的算法: [6, 7, 5, 0, 0, 0, 0, 3, 4, 0, 0, 1] .map((i) => i === 0 ? 1 : 0) .reduc
[6, 7, 5, 0, 0, 0, 0, 3, 4, 0, 0, 1]
.map((i) => i === 0 ? 1 : 0)
.reduce((prev, i) => {
if (i !== 0) {
return prev + i;
} else {
if (prev >= 4) {
return 4;
}
return 0;
}
}, 0);
.map
方法将0标记为1,非0标记为零。所以[6,7,5,0,0,0,0,3,4,0,0,0,1]
变成[0,0,0,1,1,1,1,0,0,0,0,1,1,0]
。然后.reduce
方法将收集零的数量
如果当前元素为1(表示输入数组中的零),则返回上一个值加上当前值(1)。这意味着它表示零的数量。如果当前项为0(表示在输入数组中不是0),则当它小于4时,它会将prev
重置为0,否则将继续
最后,如果值为4,则表示至少有4个连续0
算法运行正常,但不符合要求。如果输入有4个连续的0,则需要返回1,否则应返回任何非零数字
你有什么办法可以做到这一点吗?你可以用一个对象来计数
Array#如果找到正确的计数,则某些
允许结束迭代,与迭代所有元素的计数相反
函数是连续的(数组){
return+array.some(函数(a,i){
如果(a==0){
这个.count++;
返回此值。计数===4;
}
此值为0.count;
},{count:0});
}
log(是连续的([6,7,5,0,0,0,0,3,4,0,0,0,1]);
log(是连续的([6,7,5,0,0,0,3,4,0,0,0,0,0,0,0,1]);
log(是连续的([5,0,0,0,3,4,0,0,0,8,0,0,0,1])代码>这是一个使用4位表示的ES6函数,其中每个1位表示输入数组中的非零值
只有最近的4位被保留:每次迭代下一位从右边移入,而最左边的被丢弃,始终保持4位。如果结果在任何时候变为零,则循环停止:
函数has0000(arr){
设c=1;
返回+!arr.every(n=>c=(c*2+!!n)&0xF);
}
log(has0000([6,7,5,0,0,0,0,0,3,4,0,0,1]);
log(has0000([6,7,5,0,0,0,3,4,0,0,1])使用.map
和.reduce
编码>以满足您的要求:
//如果至少有4个连续的0,则以下函数返回1
//否则返回0、2、4或6:
函数cons4zero(arr){
返回arr
.map((i)=>i^0?0:2)
.reduce((p,i)=>p^1?
i^0?
(p+i)%7:
0 :
1.
0)
}
console.log(
cons4zero([6,7,5,0,0,0,0,3,4,0,0,1]),“=>1”
);
console.log(
cons4zero([6,7,5,0,0,0,3,4,0,0,0,0,0,1]),“=>1”
);
console.log(
cons4zero([5,0,0,3,4,0,0,8,0,0,1]),“=>某物#1”
);代码>一般来说,您的实现在我看来很好,除了一点细微差别:您应该指定-3
作为reduce函数的初始值(并相应地修改其主体以满足您的要求)
下面提供了您的实现的修改版本,如果存在至少4个连续零,则返回1
,否则返回以下值之一:-3
、-2
、-1
或0
var result=[6,7,5,0,0,0,0,3,4,0,0,1]
.map((i)=>i==0?1:0)
.减少((上一个,i)=>{
如果(上一个===1){
返回1;
}
如果(i==0){
返回-3;
}
返回上一个+(i==1);
}, -3);
console.log(result)
如果不需要对数组求和,执行arr.toString().indexOf('0000')>-1不是更容易吗
关键是我需要map-reduce算法。这可以通过下面的答案这样更具创造性的方式来实现。这很酷,数组前面的+
是什么意思?一些返回true
或false
,但是我们需要一个数值,比如true
和0
(与1
不同的值)对于false
。加号运算符是一元数,并将以下值转换为Number
。谢谢,我最近才想到这一点