javascript - 避免使用嵌套循环来查找数组的最大子字符串?
问题描述
应返回根据输入长度添加的最大数量。
例如,如果长度是, ,2
中的最大值arr[0] + arr[1]
,则应返回。arr[1] + arr[2]
arr[2] + arr[3]
输入是数组和长度。
我在一次真正的工作面试中解决了这个问题,但我认为会有一种不使用嵌套循环的方法。
const add = (arr, len) => {
let rtnVal = 0
for (let i = len - 1; i < arr.length; i++) {
let temp_idx = i;
let temp_sum = 0;
for (let j = 0; j < len; j++) {
temp_sum = (temp_sum || 0) + arr[temp_idx]
temp_idx -= 1
}
if (temp_sum > rtnVal) {
rtnVal = temp_sum
}
}
return rtnVal
}
console.log(add([1, 2, 3, 4, 5, 6, 7, 8, 9], 4))
我希望输出 30
// enhanced nested loop
const add = (arr, len) => {
let rtnVal = 0;
for(let i=len-1;i<arr.length;i++){
let sum = 0
for(let j=i;j>=i-len+1;j--){
sum += arr[j]
}
if (sum > rtnVal) rtnVal = sum
}
return rtnVal
}
console.log(add([9, 9, 9, 4, 5, 6, 7, 8, 9], 3))
解决方案
使用移动窗口。len
从头开始将数字相加。然后继续通过数组添加下一个数字并减去尾随数字。
const add = (arr, len) => {
return arr.reduce((a,v,i,arr) => {
a.running += v;
if(i >= len) {
a.running -= arr[i-len];
}
if(i+1 >= len && a.largest < a.running) {
a.largest = a.running;
}
return a;
}, {
largest: Number.NEGATIVE_INFINITY,
running: 0
}).largest;
}
console.log(add([1,2,3,4,5,6,7,8,9],4)); // 30
console.log(add([-1,-1,-1,-1],2)); // -2
console.log(add([1],1)); // 1
推荐阅读
- ionic-framework - 如何在通知 ionic 3 one 信号中使用自定义声音?
- reactjs - 让 ts+react 在组件中看到一个带默认值的可选道具不可为空?
- sql - 在 group 和 joins 之后返回的 table 具有不切实际的大数字
- git - VSTS - 陷入发布新的现有本地项目的无限循环
- entity-framework-6 - 初始化数据库时发生异常。删除后重新创建用户登录失败
- inkscape - 连接器连接到的对象移动时失败
- python - 否则一无所获,但不是逐行迭代
- css - 将状态显示为带有状态的 css 道具。reactJS中的内联样式
- javascript - JS 函数中的 PHP 操作根本不返回 var
- chapel - 用于检查可选参数的测试函数