Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 寻找连续序列的MapReduce算法_Javascript_Algorithm_Mapreduce - Fatal编程技术网

Javascript 寻找连续序列的MapReduce算法

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

我需要编写一个小的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)
    .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
。谢谢,我最近才想到这一点