Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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-子数组和等于K_Javascript_Algorithm_Ecmascript 6 - Fatal编程技术网

Javascript-子数组和等于K

Javascript-子数组和等于K,javascript,algorithm,ecmascript-6,Javascript,Algorithm,Ecmascript 6,我只是在看一些面试问题,遇到了这个家伙 Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k. Example 1: Input:nums = [1,1,1], k = 2 Output: 2 我知道我可以循环并以更冗长的方式来做这件事,但我想知道我是否可以使用reduce 当我将以下参数传递给它

我只是在看一些面试问题,遇到了这个家伙

Given an array of integers and an integer k, 
you need to find the total number of continuous subarrays whose sum equals to k.

Example 1:
Input:nums = [1,1,1], k = 2
Output: 2
我知道我可以循环并以更冗长的方式来做这件事,但我想知道我是否可以使用
reduce

当我将以下参数传递给它时,我有以下失败之处:

子阵列和([-1,-1,1],0)


减少将是一种过度的杀伤力。此外,为每个元素调用其回调的开销会降低算法的效率

相反,for循环是实现它的最佳方式。您可以在下面找到一个可能的非原始解决方案:

var-arr=[1,2,3,4,5];
var-map=[];
var计数器=0;
var k=5;
函数updateMap(newValue){
map.push(0);//新值的占位符;
对于(变量i=0;i控制台日志(“结果:+计数器)Reduce将是一种过度杀伤力。此外,为每个元素调用其回调的开销会降低算法的效率

相反,for循环是实现它的最佳方式。您可以在下面找到一个可能的非原始解决方案:

var-arr=[1,2,3,4,5];
var-map=[];
var计数器=0;
var k=5;
函数updateMap(newValue){
map.push(0);//新值的占位符;
对于(变量i=0;i控制台日志(“结果:+计数器)
是的,在这里使用
reduce
以线性时间回答问题非常方便,因为它可以让我们更新和重新访问累积值:

const subraysum=(nums,k)=>
nums.reduce(([map,sum,answer],val)=>{
const newSum=sum+val;
答案+=newSum==k;
答案+=地图[newSum-k]| | 0;
map[newSum]=(map[newSum]| | 0)+1;
返回[地图、新闻、答案];
}, [{}, 0, 0])[2];
log(子数组和([-1,-1,1],0));

log(子数组和([1,-1,1,-1],0))
是的,在这里使用
reduce
以线性时间回答问题非常方便,因为它可以让我们更新和重新访问累积值:

const subraysum=(nums,k)=>
nums.reduce(([map,sum,answer],val)=>{
const newSum=sum+val;
答案+=newSum==k;
答案+=地图[newSum-k]| | 0;
map[newSum]=(map[newSum]| | 0)+1;
返回[地图、新闻、答案];
}, [{}, 0, 0])[2];
log(子数组和([-1,-1,1],0));

log(子数组和([1,-1,1,-1],0))
这不是一个新问题,当然也不是JS独有的问题:你记得先问吗?@Mike'Pomax'Kamermans我知道这一点,但我想知道是否可以使用
reduce
解决这个问题?任何for循环都可以,
reduce
都可以,所以简短的答案是“当然”,但更详细的答案是“如果你只想知道reduce是否能完成任务,请重写你的问题”这不是一个新问题,当然也不是JS独有的问题:你记得先问吗?@Mike'Pomax'Kamermans我知道这一点,但我想知道是否可以使用
reduce
?for循环可以做的任何事情,
reduce
都可以做,所以简单的答案是”“当然”,但更详细的答案是“如果你只想知道reduce是否能完成任务,请重写你的问题。”“您可以将数组作为第一个参数添加到
reduce
?@peterflanagan您可以添加任何您想要的内容。是的,只想到在您可以将数组作为第一个参数添加到
reduce
?@peterflanagan之后,您可以添加任何您想要的内容。是的,只想到在
const subarraySum = (nums, k) => {
    let answer = 0;
    nums.reduce((acc, val) => {          
        if(acc + val === k) {
            answer++;
            return val;
        }
        if(val === k) {
            answer++
            return val
        }
        return acc + val;
    }, 0)

    return answer;
};