news 2026/3/24 1:49:09

华为OD机考双机位C卷 - 最佳升级时间窗 (C++ Python JAVA JS GO)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机考双机位C卷 - 最佳升级时间窗 (C++ Python JAVA JS GO)

最佳升级时间窗

2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型

华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解

题目描述

有一套系统需升级,为减小系统升级期间的影响,需根据系统过去一段时间内的每小时平均访问数据,来预测最佳升级时间窗。

现给长度为168(7*24)的整数数组,表示一个周期(假设从周一00:00到周日24:00)的每小时历史数据,最佳升级时间窗选择规则如下:

1:时间窗内累计用户访问量必须小于等于给定的容忍值。

2:时间窗必须是连续的x个小时,最大的x即为最佳升级时间窗,且不超过7*24.

3:时间窗允许跨周期,例如当前周期的第167小时到下一周期的第166小时,是一个长度为168的时间窗。

请计算最佳升级时间窗,并返回其开始时间和结束时间的数组下标。如果存在多个最佳升级时间窗,返回开始时间下标最小的一个。

输入描述

第一行为整数n,表示给定的升级影响的容忍值,取值范围:[0, 2^31]。

第二行为7 * 24个整数,表示一个周期(7*24)的每个小时用户访问量,每个值的范围:[0, 2^31]。

输出描述

两个整数,分别表示所计算出的最佳升级时间窗的开始时间下标(包含)和结束时间下标(包含),不存在时返回 -1 -1 。

用例1

输入

6 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1

输出

22 25

说明

最佳升级窗口为:2 1 1 2

题解

思路:滑动窗口

  1. 这类题就是典型使用滑动窗口解决的题
  2. 然后思考怎么解决题目提到的时间窗允许跨周期的问题,对于这类首尾可以连接的问题,可以将数组进行扩容168*2将数组重复一次,跨周期的窗口就可以变为普通连续子数组问题。
  3. 接下来就是正常滑动窗口处理逻辑,定义左边界left = 0, right =0, 窗口和windowsSum =0maxLen= 0, resLeft = -1, resRight = -1, 接下来就是循环移动右边界,每次执行以下操作
    • windowsSum += seq[i]
    • 如果windowsSum > n,不断收缩左边界直到windowSum <=n结束,收缩边界每次执行windowsSum -= seq[left], left++
    • 经过上面就会得到一个合法的窗口,计算长度为len = right - left + 1, 然后根据与maxLen更新结果即可。这里有个易错点:之前将原数组扩容了,可能存在n > sum(originalSeq)这样长度可以超过168所以当len == 168可以直接退出滑动窗口逻辑。
    • 优化点:如果当left >= 168也可以提前退出滑动窗口逻辑,因为这里又进入了第一个周期一样的逻辑,没必要重复找。当前不做这个优化这道题也不会超时。
  4. 执行3的逻辑之后,此时根据maxLen的值输出结果
    • maxLen = 0: 说明不存在这样窗口直接输出-1 -1
    • maxLen !=0: 说明存在窗口,此时需要输出(resLeft % 168) (resRight % 168),%128主要是处于跨周期的情况要保证输出的为[0,167]范围。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; int main() { long n; cin >> n; // 由于可以首尾相连,直接将数组重复一次,这样跨周期的窗口就可以变为普通连续子数组问题 vector<long> seq(168 * 2); for (int i = 0; i < 168; i++) { cin >> seq[i]; seq[i + 168] = seq[i]; } int maxLen = 0; int resLeft = -1, resRight = -1; long windowSum = 0; int left = 0; for (int right = 0; right < 168 * 2; right++) { windowSum += seq[right]; // 保证窗口和不超过容忍值 while (windowSum > n) { windowSum -= seq[left]; left++; } // 和第一个周期重复了 if (left >= 168) { break; } int len = right - left + 1; if (len > maxLen) { maxLen = len; resLeft = left; resRight = right; } // 已经达到最大周期,可以直接退出 if (len == 168) { break; } } if (maxLen == 0) { cout << "-1 -1"; }else { cout << resLeft % 168 << " " << resRight % 168; } return 0; }

JAVA

import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); long n = sc.nextLong(); // 由于可以首尾相连,直接将数组重复一次,这样跨周期的窗口就可以变为普通连续子数组问题 long[] seq = new long[168 * 2]; for (int i = 0; i < 168; i++) { seq[i] = sc.nextLong(); seq[i + 168] = seq[i]; } int maxLen = 0; int resLeft = -1, resRight = -1; long windowSum = 0; int left = 0; for (int right = 0; right < 168 * 2; right++) { windowSum += seq[right]; // 保证窗口和不超过容忍值 while (windowSum > n) { windowSum -= seq[left]; left++; } // 和第一个周期重复了 if (left >= 168) { break; } int len = right - left + 1; if (len > maxLen) { maxLen = len; resLeft = left; resRight = right; } // 已经达到最大周期,可以直接退出 if (len == 168) { break; } } if (maxLen == 0) { System.out.println("-1 -1"); } else { System.out.println(resLeft % 168 + " " + resRight % 168); } } }

Python

n=int(input())arr=list(map(int,input().split()))# 由于可以首尾相连,重复一次seq=arr+arr maxLen=0resLeft=-1resRight=-1windowSum=0left=0forrightinrange(len(seq)):windowSum+=seq[right]# 保证窗口和不超过容忍值whilewindowSum>n:windowSum-=seq[left]left+=1# 和第一个周期重复了ifleft>=168:breaklength=right-left+1iflength>maxLen:maxLen=length resLeft=left resRight=right# 已经达到最大周期,可以直接退出iflength==168:breakifmaxLen==0:print("-1 -1")else:print(resLeft%168,resRight%168)

JavaScript

letinput=[];require('readline').createInterface({input:process.stdin,output:process.stdout}).on('line',line=>input.push(line)).on('close',()=>{letn=parseInt(input[0]);letarr=input[1].split(' ').map(Number);// 由于可以首尾相连,重复一次letseq=arr.concat(arr);letmaxLen=0;letresLeft=-1,resRight=-1;letwindowSum=0;letleft=0;for(letright=0;right<seq.length;right++){windowSum+=seq[right];// 保证窗口和不超过容忍值while(windowSum>n){windowSum-=seq[left];left++;}// 和第一个周期重复了if(left>=168)break;letlen=right-left+1;if(len>maxLen){maxLen=len;resLeft=left;resRight=right;}// 已经达到最大周期,可以直接退出if(len==168)break;}if(maxLen==0){console.log("-1 -1");}else{console.log(resLeft%168,resRight%168);}});

Go

packagemainimport("fmt")funcmain(){varnint64fmt.Scan(&n)seq:=make([]int64,168*2)fori:=0;i<168;i++{fmt.Scan(&seq[i])seq[i+168]=seq[i]// 重复一次}maxLen:=0resLeft,resRight:=-1,-1varwindowSumint64=0left:=0forright:=0;right<168*2;right++{windowSum+=seq[right]// 保证窗口和不超过容忍值forwindowSum>n{windowSum-=seq[left]left++}// 和第一个周期重复了ifleft>=168{break}length:=right-left+1iflength>maxLen{maxLen=length resLeft=left resRight=right}// 已经达到最大周期,可以直接退出iflength==168{break}}ifmaxLen==0{fmt.Println("-1 -1")}else{fmt.Println(resLeft%168,resRight%168)}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 9:16:31

4G与4G+路由器:技术与实际体验的差异

4G路由器&#xff0c;作为占据大众主流市场的产品种类之一&#xff0c;随着4G这一概念的普及&#xff0c;会逐渐失去市场吗&#xff1f;也许大家也会疑惑这两者的不同。本文&#xff0c;就从这一角度出发&#xff0c;来和大家聊聊这两种路由器的区别。基础差异4G路由器&#xf…

作者头像 李华
网站建设 2026/3/19 9:15:27

还在盲目冲业绩?亚马逊增长双引擎,先重塑内功再谈破局

亚马逊的竞争已经从流量争夺转向转化效率的深度较量&#xff0c;实现可持续增长&#xff0c;关键在于系统化结合“站内转化内功”与“站外精准引流”&#xff0c;构建自我强化的增长飞轮。一、内功筑基&#xff1a;以用户为中心的Listing重塑Listing优化的核心在于高效“对话”…

作者头像 李华
网站建设 2026/3/18 23:10:23

OpenEuler 等 Linux 系统中运行 Vue 项目的方法

在 OpenEuler 等 Linux 系统中运行 Vue 项目,通常需要经过环境准备、项目部署、启动服务三个步骤。以下是详细操作指南: 一、准备运行环境 Vue 项目依赖 Node.js(包含 npm 包管理器),需先安装: 1. 安装 Node.js 和 npm 方法 1:通过系统包管理器(推荐,适合 OpenEule…

作者头像 李华
网站建设 2026/3/20 18:15:22

35、SharePoint开发:架构、特性与部署全解析

SharePoint开发:架构、特性与部署全解析 1. SharePoint架构与页面创建概述 在SharePoint开发中,我们首先从整体上了解其架构。可以使用SharePoint Designer来创建母版页和网站页面。这里需要区分网站页面和应用程序页面,网站页面更侧重于展示内容,而应用程序页面则提供特…

作者头像 李华
网站建设 2026/3/21 3:38:30

36、SharePoint 打包与部署全解析

SharePoint 打包与部署全解析 1. 引言 在 SharePoint 开发中,单个功能的安装相对简单,但当需要一次性安装多个功能时,就需要一种有效的机制将这些功能组合起来进行打包和部署。SharePoint 解决方案打包就是这样一种机制,它能帮助我们更高效地管理和部署多个功能。 2. Sh…

作者头像 李华
网站建设 2026/3/22 18:07:59

37、深入探究 SharePoint 项目结构与部署

深入探究 SharePoint 项目结构与部署 1. 映射文件夹 在 Visual Studio 的 SharePoint 项目中,映射文件夹是一种非常有用的结构,它能将 Visual Studio 项目中的文件部署到 SharePoint 配置单元下的文件夹中,比如 Program Files\Common Files\Microsoft Shared\web server …

作者头像 李华