【2026OD新机考】【固定滑窗】20260830-小花获胜的奶茶【Py/Java/C++/C/JS/Go六种语言OD真题】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
发布时间:2026/9/27 2:07:14来源:尧图网络
文章目录相关推荐阅读题目描述与示例题目描述输入描述输出描述示例输入输出说明解题思路代码PythonJavaCCNode JavaScriptGo时空复杂度华为OD算法/大厂面试高频题算法练习冲刺训练相关推荐阅读【2026华为OD机考】最新套题持续更新【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言PyJavaCppCJsGo】【2026年华为OD机考最新政策】2026年新规改革最新变化 | 学习策略 | 考试时间 | 出题形式 | 输入形式 | 考前流程 | 双机位摆放【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言PyJavaCppCJsGo】【华为OD机考】2025C2025B2024ED卷真题【完全原创题解 | 详细考点分类 | 不断更新题目】【华为OD笔试】双机位A2025C2025B2024ED卷真题机考套题汇总【真实反馈不断更新限时免费】【华为OD笔试】2024ED卷命题规律解读【分析500场OD笔试考点总结】【华为OD流程】性格测试选项注意事项题目练习网址【固定滑窗】20260830-小花获胜的奶茶题目描述与示例题目描述小菊和小花是好朋友他们经常一起玩游戏。这天他们玩一个数字游戏获胜可以获得对方1杯奶茶。游戏规则小菊在纸上写了一排数组小花需要从中选择连续k个数字使得这k个数字的和最大。小花正确找到最大的值就是获胜小菊则提供1杯奶茶小花想获胜喝奶茶请你帮助她。输入描述参数1int数组给出的一排数字参数2int整数k约束-2147483648 单个数字 2147483647 0 一排数字长度 1063 1 k 一排数字的长度输出描述最大k个数字和示例输入1,3,8,6,4,103输出20说明6410三个数和最大6 4 10 20解题思路这是一个非常典型的固定滑窗问题。容易想到如果我们采用暴力思路枚举所有长度为k的连续子数组并逐个求和那么时间复杂度会达到O(n × k)注意到题目中数组长度最大接近10^3虽然不算极大但题目显然希望我们掌握更优的通用解法。换句话说我们应该利用相邻窗口之间的重叠部分来优化计算当窗口从[i, ik-1]向右滑动到[i1, ik]时这两个窗口里的元素几乎完全一样变化的仅仅是左侧的nums[i]离开了窗口右侧的nums[ik]进入了窗口。因此新的窗口和可以由旧窗口和的基础上在O(1)时间内推导出来而不需要重新遍历k个元素。直接考虑滑窗三问三答即可解决该问题属于非常典型的模板题。代码PythonfromtypingimportList# 题目【固定滑窗】20260830-小花获胜的奶茶# 分值100# 作者闭着眼睛学数理化# 算法固定滑窗# 代码看不懂的地方请直接在群上提问# 代码中的类名、方法名、参数名已经指定# param nums: 给出的一排数字# param k: 需要选择的连续数字个数# return: 连续 k 个数字的最大和classSolution:defsolve(self,nums:List[int],k:int)-int:nlen(nums)# 初始化第一个窗口的累加和即下标 [0, k-1] 这 k 个数字的总和cur_sum0foriinrange(k):cur_sumnums[i]# 初始状态下最大和就是第一个窗口的和max_sumcur_sumforrightinrange(k,n):# A1将 nums[right] 加入当前窗口总和完成窗口右侧的扩张cur_sumnums[right]# A2在固定滑窗中左侧边界 left 始终等于 right - k# 换句话说最左边的那个元素已经滑出了窗口需要从总和中减掉leftright-k cur_sum-nums[left]# A3窗口移动完成后用当前窗口和去更新历史最大和# 注意到题目只要求返回最大和不要求返回起始索引因此直接取 max 即可ifcur_summax_sum:max_sumcur_sumreturnmax_sum# 以下内容为 LeetCode 核心代码模式转为 ACM 模式所需代码# 请在 algomooc oj 上直接使用在实际考试中无需编写if__name____main__:numslist(map(int,input().strip().split(,)))kint(input().strip())print(Solution().solve(nums,k))Javaimportjava.util.Scanner;// 题目【固定滑窗】20260830-小花获胜的奶茶// 分值100// 作者闭着眼睛学数理化// 算法固定滑窗// 代码看不懂的地方请直接在群上提问// 代码中的类名、方法名、参数名已经指定// param nums: 给出的一排数字// param k: 需要选择的连续数字个数// return: 连续 k 个数字的最大和classSolution{publiclongsolve(int[]nums,intk){intnnums.length;// 初始化第一个窗口的累加和即下标 [0, k-1] 这 k 个数字的总和longcur_sum0;for(inti0;ik;i){cur_sumnums[i];}// 初始状态下最大和就是第一个窗口的和longmax_sumcur_sum;for(intrightk;rightn;right){// A1将 nums[right] 加入当前窗口总和完成窗口右侧的扩张cur_sumnums[right];// A2在固定滑窗中左侧边界 left 始终等于 right - k// 换句话说最左边的那个元素已经滑出了窗口需要从总和中减掉intleftright-k;cur_sum-nums[left];// A3窗口移动完成后用当前窗口和去更新历史最大和// 注意到题目只要求返回最大和不要求返回起始索引因此直接取 max 即可if(cur_summax_sum){max_sumcur_sum;}}returnmax_sum;}}// 以下内容为LeetCode核心代码模式转为ACM模式所需代码// 请在algomooc oj上直接使用在实际考试中无需编写publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);Stringlinesc.nextLine();String[]partsline.split(,);int[]numsnewint[parts.length];for(inti0;iparts.length;i){nums[i]Integer.parseInt(parts[i].trim());}intkInteger.parseInt(sc.nextLine().trim());System.out.println(newSolution().solve(nums,k));}}C#includeiostream#includevector#includestring#includesstreamusingnamespacestd;// 题目【固定滑窗】20260830-小花获胜的奶茶// 分值100// 作者闭着眼睛学数理化// 算法固定滑窗// 代码看不懂的地方请直接在群上提问// 代码中的类名、方法名、参数名已经指定// param nums: 给出的一排数字// param k: 需要选择的连续数字个数// return: 连续 k 个数字的最大和classSolution{public:longlongsolve(vectorintnums,intk){intnnums.size();// 初始化第一个窗口的累加和即下标 [0, k-1] 这 k 个数字的总和longlongcur_sum0;for(inti0;ik;i){cur_sumnums[i];}// 初始状态下最大和就是第一个窗口的和longlongmax_sumcur_sum;for(intrightk;rightn;right){// A1将 nums[right] 加入当前窗口总和完成窗口右侧的扩张cur_sumnums[right];// A2在固定滑窗中左侧边界 left 始终等于 right - k// 换句话说最左边的那个元素已经滑出了窗口需要从总和中减掉intleftright-k;cur_sum-nums[left];// A3窗口移动完成后用当前窗口和去更新历史最大和// 注意到题目只要求返回最大和不要求返回起始索引因此直接取 max 即可if(cur_summax_sum){max_sumcur_sum;}}returnmax_sum;}};// 以下内容为LeetCode核心代码模式转为ACM模式所需代码// 请在algomooc oj上直接使用在实际考试中无需编写intmain(){string line;getline(cin,line);vectorintnums;string token;stringstreamss(line);while(getline(ss,token,,)){nums.push_back(stoi(token));}intk;cink;Solution solution;coutsolution.solve(nums,k)endl;return0;}C#includestdio.h#includestdlib.h#includestring.h// 题目【固定滑窗】20260830-小花获胜的奶茶// 分值100// 作者闭着眼睛学数理化// 算法固定滑窗// 代码看不懂的地方请直接在群上提问// 代码中的类名、方法名、参数名已经指定// param nums: 给出的一排数字// param k: 需要选择的连续数字个数// return: 连续 k 个数字的最大和structSolution{};voidtrim_newline(char*str){size_tlenstrlen(str);while(len0(str[len-1]\n||str[len-1]\r)){str[len-1]\0;len--;}}longlongsolve(structSolution*solution,int*nums,intnumsSize,intk){intnnumsSize;// 初始化第一个窗口的累加和即下标 [0, k-1] 这 k 个数字的总和longlongcur_sum0;for(inti0;ik;i){cur_sumnums[i];}// 初始状态下最大和就是第一个窗口的和longlongmax_sumcur_sum;for(intrightk;rightn;right){// A1将 nums[right] 加入当前窗口总和完成窗口右侧的扩张cur_sumnums[right];// A2在固定滑窗中左侧边界 left 始终等于 right - k// 换句话说最左边的那个元素已经滑出了窗口需要从总和中减掉intleftright-k;cur_sum-nums[left];// A3窗口移动完成后用当前窗口和去更新历史最大和// 注意到题目只要求返回最大和不要求返回起始索引因此直接取 max 即可if(cur_summax_sum){max_sumcur_sum;}}returnmax_sum;}// 以下内容为LeetCode核心代码模式转为ACM模式所需代码// 请在algomooc oj上直接使用在实际考试中无需编写intmain(){charline[1024]{0};if(fgets(line,sizeof(line),stdin)NULL){return0;}trim_newline(line);intcapacity16;int*nums(int*)malloc(capacity*sizeof(int));intnumsSize0;char*tokenstrtok(line,,);while(token!NULL){intvalatoi(token);if(numsSizecapacity){capacity*2;nums(int*)realloc(nums,capacity*sizeof(int));}nums[numsSize]val;tokenstrtok(NULL,,);}chark_line[64]{0};intk0;if(fgets(k_line,sizeof(k_line),stdin)!NULL){trim_newline(k_line);sscanf(k_line,%d,k);}structSolutionsolution;longlongresultsolve(solution,nums,numsSize,k);printf(%lld\n,result);free(nums);return0;}Node JavaScript// 题目【固定滑窗】20260830-小花获胜的奶茶// 分值100// 作者闭着眼睛学数理化// 算法固定滑窗// 代码看不懂的地方请直接在群上提问// 代码中的类名、方法名、参数名已经指定// param nums: 给出的一排数字// param k: 需要选择的连续数字个数// return: 连续 k 个数字的最大和classSolution{solve(nums,k){constnnums.length;// 初始化第一个窗口的累加和即下标 [0, k-1] 这 k 个数字的总和letcur_sum0;for(leti0;ik;i){cur_sumnums[i];}// 初始状态下最大和就是第一个窗口的和letmax_sumcur_sum;for(letrightk;rightn;right){// A1将 nums[right] 加入当前窗口总和完成窗口右侧的扩张cur_sumnums[right];// A2在固定滑窗中左侧边界 left 始终等于 right - k// 换句话说最左边的那个元素已经滑出了窗口需要从总和中减掉letleftright-k;cur_sum-nums[left];// A3窗口移动完成后用当前窗口和去更新历史最大和// 注意到题目只要求返回最大和不要求返回起始索引因此直接取 max 即可if(cur_summax_sum){max_sumcur_sum;}}returnmax_sum;}}// 以下内容为LeetCode核心代码模式转为ACM模式所需代码// 请在algomooc oj上直接使用在实际考试中无需编写constreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});constlines[];rl.on(line,(line){lines.push(line);if(lines.length2){rl.close();}});rl.on(close,(){constnumslines[0].split(,).map(sparseInt(s.trim()));constkparseInt(lines[1].trim());console.log(newSolution().solve(nums,k));});Gopackagemainimport(bufiofmtosstrconvstrings)// 题目【固定滑窗】20260830-小花获胜的奶茶// 分值100// 作者闭着眼睛学数理化// 算法固定滑窗// 代码看不懂的地方请直接在群上提问// 代码中的类名、方法名、参数名已经指定// param nums: 给出的一排数字// param k: 需要选择的连续数字个数// return: 连续 k 个数字的最大和typeSolutionstruct{}func(s*Solution)solve(nums[]int,kint)int{n:len(nums)// 初始化第一个窗口的累加和即下标 [0, k-1] 这 k 个数字的总和cur_sum:0fori:0;ik;i{cur_sumnums[i]}// 初始状态下最大和就是第一个窗口的和max_sum:cur_sumforright:k;rightn;right{// A1将 nums[right] 加入当前窗口总和完成窗口右侧的扩张cur_sumnums[right]// A2在固定滑窗中左侧边界 left 始终等于 right - k// 换句话说最左边的那个元素已经滑出了窗口需要从总和中减掉left:right-k cur_sum-nums[left]// A3窗口移动完成后用当前窗口和去更新历史最大和// 注意到题目只要求返回最大和不要求返回起始索引因此直接取 max 即可ifcur_summax_sum{max_sumcur_sum}}returnmax_sum}// 以下内容为LeetCode核心代码模式转为ACM模式所需代码// 请在algomooc oj上直接使用在实际考试中无需编写funcmain(){reader:bufio.NewReader(os.Stdin)line,_:reader.ReadString(\n)linestrings.TrimSpace(line)parts:strings.Split(line,,)nums:make([]int,len(parts))fori:0;ilen(parts);i{num,_:strconv.Atoi(strings.TrimSpace(parts[i]))nums[i]num}kLine,_:reader.ReadString(\n)kLinestrings.TrimSpace(kLine)k,_:strconv.Atoi(kLine)sol:Solution{}fmt.Println(sol.solve(nums,k))}时空复杂度时间复杂度O(n)其中n为数组长度。初始化第一个窗口需要O(k)后续滑动需要O(n-k)两者相加整体为O(n)空间复杂度O(1)仅使用了cur_sum、max_sum、left、right等常数个额外变量没有借助任何与数据规模相关的辅助空间。华为OD算法/大厂面试高频题算法练习冲刺训练华子OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名目前已服务1000同学成功上岸课程讲师为全网200w粉丝编程博主吴师兄学算法以及小红书头部编程博主闭着眼睛学数理化90天陪伴式学习100直播课时300动画图解视频500LeetCode经典题500华为OD真题/大厂真题还有简历修改、模拟面试、陪伴小群、资深HR对接将为你解锁
网站建设高端定制企业官网