目录
题目
思路
Code
题目
题目内容:
小菊和小花是好朋友,他们经常一起玩游戏。这天他们玩一个数字游戏,获胜可以获得对方1杯奶茶。
游戏规则:
小菊在纸上写了一排数组,小花需要从中选择连续k个数字,使得这k个数字的和最大。
小花正确找到最大的值就是获胜,小菊则提供1杯奶茶;小花想获胜喝奶茶,请你帮助她。
输入描述:
第一行输入逗号分隔的整数数组,-2147483648 <= 单个数字 <= 2147483647,数组长度小于 10^6。第二行输入 k,1 <= k <= 数组长度。
输出描述:
输出连续 k 个数字的最大和。
样例 1
输入:
1,3,8,6,4,10 3输出:
20说明:
连续三个数 6、4、10 的和最大。
思路
整体思路:维护固定长度滑动窗口。
第一步:计算前 k 个数之和作为初始窗口与答案。
第二步:窗口右移时加入右端新数并移出左端旧数。
第三步:每次移动后更新最大窗口和。
边界处理:从真实窗口初始化以处理全负数;使用 64 位整数防止求和溢出。
复杂度分析:时间 O(N),额外空间 O(1)。
Code
import re import sys lines = sys.stdin.read().splitlines() # 第一行按带符号整数提取,兼容逗号和空格。 numbers = list(map(int, re.findall(r"-?\d+", lines[0]))) k = int(lines[1]) # window_sum 始终覆盖恰好 k 个连续元素,先用首个真实窗口初始化。 # numbers 保存整排数字,k 是窗口长度;后续只比较长度恰好为 k 的连续片段。 window_sum = sum(numbers[:k]) answer = window_sum for right in range(k, len(numbers)): # 窗口右移一格时加入右端新数,并移出下标 right-k 的旧数。 # 移动后的窗口覆盖下标 right-k+1 到 right,减去的 right-k 正好是刚离开窗口的元素。 window_sum += numbers[right] - numbers[right - k] answer = max(answer, window_sum) # 从真实窗口初始化保证全负输入不会被不存在的 0 窗口覆盖。 # 如果所有数字都为负数,最大和仍然是某个真实窗口的负数,不能用 0 作为初始答案。 print(answer)JS
const fs = require("fs"); const lines = fs.readFileSync(0, "utf8").split(/\r?\n/); // 带符号正则兼容逗号和空格分隔。 const numbers = (lines[0].match(/-?\d+/g) || []).map(Number); const k = Number(lines[1]); // Number 安全整数范围足以容纳题目上限下的窗口和。 // numbers 保存整排数字,k 是窗口长度;后续只比较长度恰好为 k 的连续片段。 let windowSum = numbers.slice(0, k).reduce((sum, value) => sum + value, 0); let answer = windowSum; for (let right = k; right < numbers.length; right++) { // 窗口右移一格只改变进入与离开的元素。 // 移动后的窗口覆盖下标 right-k+1 到 right,减去的 right-k 正好是刚离开窗口的元素。 windowSum += numbers[right] - numbers[right - k]; answer = Math.max(answer, windowSum); } // 从真实窗口初始化,正确处理全负数组。 // 如果所有数字都为负数,最大和仍然是某个真实窗口的负数,不能用 0 作为初始答案。 console.log(answer);【华为od机试真题Python+JS+Java+Go合集】【超值优惠】:Py/JS/Java/Go合集
【华为od机试真题Python】:Python真题题库
【华为od机试真题JavaScript】:JavaScript真题题库
【华为od机试真题Java&Go】:Java&Go真题题库
【华为od机试真题C++】:C++真题题库
【华为od机试真题C语言】:C语言真题题库
【华为od面试手撕代码题库】:面试手撕代码题库
【华为od机试面试交流群】【文章底部有二维码链接,可扫码加交流群】
华为OD机试:二本院校有机会吗? 有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。