子数组求和多查询场景代码适配问题求助
适配多查询场景的解决方案及代码优化
原代码存在的问题
你的当前代码只适配了单个查询的场景,同时还有几个逻辑问题需要修正:
- 仅取了查询中a、b对应的两个元素,而非a到b区间内的所有元素
- 使用
queries[0].pop()会直接修改原始查询数组,产生不必要的副作用 - 无论区间内有多少个0,只额外加一次c,不符合题目"每出现一个0就加c"的要求
- 未处理多查询(数组的数组)的遍历逻辑
修正后的完整代码
function findSum(numbers, queries) { // 封装单个查询的处理逻辑 const calculateSingleQuery = (query) => { // 解构查询的三个参数:起始索引a、结束索引b、数值c const [a, b, c] = query; // 转换为数组的0-based索引(题目中的索引是1-based) const startIdx = a - 1; const endIdx = b - 1; let totalSum = 0; let zeroCount = 0; // 遍历区间内的所有元素,累加和并统计0的数量 for (let i = startIdx; i <= endIdx; i++) { const currentNum = numbers[i]; totalSum += currentNum; if (currentNum === 0) { zeroCount++; } } // 加上每个0对应的c值 totalSum += zeroCount * c; return totalSum; }; // 判断查询类型:单个查询直接返回结果,多查询返回结果数组 if (!Array.isArray(queries[0])) { return calculateSingleQuery(queries); } return queries.map(calculateSingleQuery); }
代码说明
- 单个查询处理:用
calculateSingleQuery函数封装单个查询的逻辑,避免重复代码 - 索引转换:将题目中的1-based索引转换为JavaScript数组的0-based索引,确保区间遍历正确
- 区间遍历:通过for循环遍历从startIdx到endIdx的所有元素,准确计算区间和与0的数量
- 多查询适配:判断查询参数是否为数组的数组,若是则用
map遍历所有查询,返回对应结果数组 - 无副作用:避免修改原始输入数组,保证数据安全性
测试示例
- 单个查询:
findSum([4,6,0,10], [1,3,20])返回4+6+0 + 1*20 = 30 - 多查询:
findSum([4,6,0,10], [[2,2,20], [1,2,10]])返回[6 + 0*20, 4+6 +0*10] = [6, 10]
内容的提问来源于stack exchange,提问作者reactjs
相关产品推荐
相关产品推荐

