该算法题来自于 codewars【语言: javascript】,翻译如有误差,敬请谅解~
- 场景
给定一个包含一些整数(正,负或0)的数组arr,范围列表如[[start1,end1],[start2,end2],...],开始和结束是arr的索引,此时开始总是小于结束。您的任务是计算每个范围的总和值,并返回最大和值。
- 任务
- 写一个函数需要两个参数 - 直径,价格 - 并将每平方的价格返回,保留两位小数。 (作为一个数字,而不是字符串)
- 例如:
Given arr = [1,-2,3,4,-5,-4,3,2,1],
range = [[1,3],[0,4],[6,8]]
should return 6
calculation process:
range[1,3] = arr[1]+arr[2]+arr[3] = 5
range[0,4] = arr[0]+arr[1]+arr[2]+arr[3]+arr[4] = 1
range[6,8] = arr[6]+arr[7]+arr[8] = 6
所以最大和值是 6
maxSum([1,-2,3,4,-5,-4,3,2,1],[[1,3],[0,4],[6,8]]) // 6
maxSum([1,-2,3,4,-5,-4,3,2,1],[[1,3]]) // 5
maxSum([1,-2,3,4,-5,-4,3,2,1],[[1,4],[2,5]]) // 0
- 注意:
1.
arr
至少有5个元素。
2.range
至少有1个元素。
3.所有输入均有效。
- 解答
- 其一
const maxSum = (arr,range) => range.map(el=>arr.slice(el[0],el[1]+1).reduce((r,v)=>r+v,0)).sort((a,b)=>b-a)[0];
- 其二
const maxSum = (arr,range) => Math.max(...range.map(i => arr.slice(i[0], i[1] + 1).reduce((a, b) => a + b)))
- 其三
const maxSum = (arr,range) => {
const getSum = ([start, end]) => arr.slice(start, end + 1).reduce((a, b) => a + b);
return Math.max(...range.map(v => getSum(v)));
}
网友评论