华为OD机试真题 新系统 2026-06-17 Python&JS 实现【数据中心最佳维护窗口】
目录
题目
某数据中心记录了连续 N 小时内每小时的服务器负载得分,记录在数组 scores 中;0 表示该小时无效(服务器故障)。
现在需要选择连续 W 小时的窗口作为最佳维护窗口,满足如下规则:
第1点:窗口内不能包含无效小时。
第2点:窗口的负载得分总和最小;若存在多个总和相同的窗口,选取起始小时最早的窗口。
第3点:不存在满足条件的窗口时,输出 [-1,0]。
输入描述
输入包括:
N:总小时数,公开片段可确认约束开头为 1 <= N <= 100。
scores:长度为 N 的整数数组,表示每小时服务器负载得分,0 表示该小时无效。
W:维护窗口长度,表示需要连续选择 W 小时。
输出描述
输出数组 [start, sum]:
start 表示最佳维护窗口的起始小时下标。
sum 表示该窗口内负载得分总和。
如果不存在合法窗口,输出 [-1,0]。
样例 1
输入:
6
5,3,0,2,1,4
2
输出:
[3,3]
说明:长度为 2 且不包含无效小时的窗口有 [5,3]、[2,1]、[1,4],得分和分别为 8、3、5。最小和为 3,起始下标为 3。
样例 2
输入:
4
1,0,2,3
2
输出:
[2,5]
说明:窗口 [1,0] 和 [0,2] 包含无效小时,只有 [2,3] 合法,输出起始下标 2 和窗口和 5。
样例 3
输入:
3
1,0,2
2
输出:
[-1,0]
说明:所有长度为 2 的窗口都包含无效小时,因此不存在合法维护窗口。
思路
用滑动窗口维护连续 `W` 小时的负载和,同时记录窗口内有多少个 `0`。窗口每向右移动一步,加入右端元素,窗口长度超过 `W` 时移除左端元素。只有窗口长度等于 `W` 且无效小时数量为 0 时,才是合法维护窗口。合法窗口中优先选择总和更小的;总和相同不更新,这样自然保留最早起点。
Code
n = int(input().strip())
# 读取小时数量、每小时负载和窗口长度,窗口长度决定滑动范围。
scores = list(map(int, input().strip().split(",")))
w = int(input().strip())
# 窗口状态同时维护负载和 curSum 与无效小时 zeroCount。
best_start, best_sum = -1, 0
cur_sum = zero_count = 0
# 右端加入新小时,窗口超过 W 后移除最左侧小时。
for r, x in enumerate(scores):
cur_sum += x
if x == 0:
zero_count += 1
if r >= w:
old = scores[r - w]
cur_sum -= old
if old == 0:
zero_count -= 1
if r >= w - 1 and zero_count == 0:
start = r - w + 1
# 只在更小总和时更新,保留最早起点。
if best_start == -1 or cur_sum < best_sum:
best_start, best_sum = start, cur_sum
# 按 [起点,负载和] 输出;不存在合法窗口时保持 [-1,0]。
print(f"[{best_start},{best_sum}]")
JS
const fs = require("fs");
// 读取小时数量、每小时负载和窗口长度,窗口长度决定滑动范围。
const lines = fs.readFileSync(0, "utf8").trim().split(/\n/);
const n = Number(lines[0]);
const scores = lines[1].split(",").map(Number);
const w = Number(lines[2]);
// 窗口状态同时维护负载和 curSum 与无效小时 zeroCount。
let bestStart = -1, bestSum = 0;
let curSum = 0, zeroCount = 0;
// r 表示当前窗口右端,每轮先把 scores[r] 纳入窗口。
for (let r = 0; r < n; r++) {
curSum += scores[r];
// 0 代表无效小时,窗口内只要有 0 就不能作为候选。
if (scores[r] === 0) zeroCount++;
if (r >= w) {
const old = scores[r - w];
curSum -= old;
if (old === 0) zeroCount--;
}
if (r >= w - 1 && zeroCount === 0) {
const start = r - w + 1;
// 只更新更小总和,保留相同总和下的最早窗口。
if (bestStart === -1 || curSum < bestSum) {
bestStart = start;
bestSum = curSum;
}
}
}
// 按 [起点,负载和] 输出;不存在合法窗口时保持 [-1,0]。
console.log(`[${bestStart},${bestSum}]`);
【华为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。让他帮助你查询原因。
更多推荐





所有评论(0)