目录题目思路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输入65,3,0,2,1,42输出[3,3]说明长度为 2 且不包含无效小时的窗口有 [5,3]、[2,1]、[1,4]得分和分别为 8、3、5。最小和为 3起始下标为 3。样例 2输入41,0,2,32输出[2,5]说明窗口 [1,0] 和 [0,2] 包含无效小时只有 [2,3] 合法输出起始下标 2 和窗口和 5。样例 3输入31,0,22输出[-1,0]说明所有长度为 2 的窗口都包含无效小时因此不存在合法维护窗口。思路用滑动窗口维护连续 W 小时的负载和同时记录窗口内有多少个 0。窗口每向右移动一步加入右端元素窗口长度超过 W 时移除左端元素。只有窗口长度等于 W 且无效小时数量为 0 时才是合法维护窗口。合法窗口中优先选择总和更小的总和相同不更新这样自然保留最早起点。Codeimport java.util.*; public class Main { public static void main(String[] args) { // 读取小时数量、每小时负载和窗口长度窗口长度决定滑动范围。 Scanner sc new Scanner(System.in); int n Integer.parseInt(sc.nextLine().trim()); String[] parts sc.nextLine().trim().split(,); int w Integer.parseInt(sc.nextLine().trim()); int[] scores new int[n]; // 把逗号分隔的负载字符串转换为数组后面滑动窗口按下标访问。 for (int i 0; i n; i) scores[i] Integer.parseInt(parts[i].trim()); // 窗口状态同时维护负载和 curSum 与无效小时 zeroCount。 int bestStart -1, bestSum 0, curSum 0, zeroCount 0; // r 表示当前窗口右端每轮先把 scores[r] 纳入窗口。 for (int r 0; r n; r) { curSum scores[r]; // 0 代表无效小时窗口内只要有 0 就不能作为候选。 if (scores[r] 0) zeroCount; if (r w) { int old scores[r - w]; curSum - old; if (old 0) zeroCount--; } if (r w - 1 zeroCount 0) { int start r - w 1; // 相同总和不更新保证起点最早。 if (bestStart -1 || curSum bestSum) { bestStart start; bestSum curSum; } } } // 按 [起点,负载和] 输出不存在合法窗口时保持 [-1,0]。 System.out.println([ bestStart , bestSum ]); } }Gopackage main import ( bufio fmt os strconv strings ) func main() { // 读取小时数量、每小时负载和窗口长度窗口长度决定滑动范围。 in : bufio.NewScanner(os.Stdin) in.Scan() n, _ : strconv.Atoi(strings.TrimSpace(in.Text())) in.Scan() parts : strings.Split(strings.TrimSpace(in.Text()), ,) in.Scan() w, _ : strconv.Atoi(strings.TrimSpace(in.Text())) scores : make([]int, n) // 把逗号分隔的负载字符串转换为数组后面滑动窗口按下标访问。 for i, p : range parts { scores[i], _ strconv.Atoi(strings.TrimSpace(p)) } // 窗口状态同时维护负载和 curSum 与无效小时 zeroCount。 bestStart, bestSum : -1, 0 curSum, zeroCount : 0, 0 // r 表示当前窗口右端每轮先把 scores[r] 纳入窗口。 for r, x : range scores { curSum x // 0 代表无效小时窗口内只要有 0 就不能作为候选。 if x 0 { zeroCount } if r w { old : scores[r-w] curSum - old if old 0 { zeroCount-- } } if r w-1 zeroCount 0 { start : r - w 1 // 相同和不更新从而保留最早起点。 if bestStart -1 || curSum bestSum { bestStart, bestSum start, curSum } } } // 按 [起点,负载和] 输出不存在合法窗口时保持 [-1,0]。 fmt.Printf([%d,%d]\n, bestStart, bestSum) }C#include stdio.h #include stdlib.h #include string.h int main() { int n, w; char line[10000]; /* 读取小时数量、每小时负载和窗口长度窗口长度决定滑动范围。 */ scanf(%d, n); scanf(%s, line); scanf(%d, w); int scores[1005]; int idx 0; char *tok strtok(line, ,); while (tok) { scores[idx] atoi(tok); tok strtok(NULL, ,); } /* 窗口状态同时维护负载和 curSum 与无效小时 zeroCount。 */ int bestStart -1, bestSum 0, curSum 0, zeroCount 0; /* 右端加入新小时窗口超过 W 后移除最左侧小时。 */ for (int r 0; r n; r) { curSum scores[r]; /* 只有窗口长度为 W 且不含 0 时才参与最优答案比较。 */ if (scores[r] 0) zeroCount; if (r w) { int old scores[r - w]; curSum - old; if (old 0) zeroCount--; } if (r w - 1 zeroCount 0) { int start r - w 1; /* 相同总和不更新保留更早起点。 */ if (bestStart -1 || curSum bestSum) { bestStart start; bestSum curSum; } } } /* 按 [起点,负载和] 输出不存在合法窗口时保持 [-1,0]。 */ printf([%d,%d]\n, bestStart, bestSum); return 0; }【华为od机试真题PythonJSJavaGo合集】【超值优惠】Py/JS/Java/Go合集【华为od机试真题Python】Python真题题库【华为od机试真题JavaScript】JavaScript真题题库【华为od机试真题JavaGo】JavaGo真题题库【华为od机试真题C】C真题题库【华为od机试真题C语言】C语言真题题库【华为od面试手撕代码题库】面试手撕代码题库【华为od机试面试交流群】【文章底部有二维码链接可扫码加交流群】华为OD机试:二本院校有机会吗?有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。