目录

题目

思路

Code


题目

某数据中心记录了连续 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。让他帮助你查询原因。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐