9.9华为OD机试真题 新系统 – 数列求值 (JavaPyCC++JsGo)
2026 华为OD机试真题9月9日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
有一个连续的数列,它的前 7 个数为 1,2,3,4,5,6,7。从第 8 个数开始,每个数的值等于它所在位置前面最近连续 7 个数中,最大的两个数之和减去最小的两个数之和。
例如:第 8 个数的值,是它前面的 7 个数(1,2,3,4,5,6,7)中,最大的两个数(6、7)之和减去最小的两个数(1、2)之和,即 6+7−1−2=10。
现在给定一个位置 n,请返回该位置上的数值。
请实现以下接口:
int getResult(int n)
n:数列中的位置,1≤n≤1000- 返回:数列第 n 个位置上的数值
2026 华为OD机试真题9月9日华为OD上机新系统考试真题 100 分题型
输入描述
输入一个整数 n,表示数列的位置。
输出描述
输出一个整数,表示该位置上数字的值。
示例1
输入
3
输出
3
说明
该数列前 7 个数为 1,2,3,4,5,6,7,所以第 3 个数字为 3。
示例2
输入
8
输出
10
说明
第 8 个数的值是他前面的 7 个数(1,2,3,4,5,6,7)中,最大的两个数字(6、7)的和减去最小的两个数(1、2),计算得到结果为 6+7−1−2=10。
示例3
输入
10
输出
15
说明
递推得到数列:
- 第 1 个数:1
- 第 2 个数:2
- 第 3 个数:3
- 第 4 个数:4
- 第 5 个数:5
- 第 6 个数:6
- 第 7 个数:7
- 第 8 个数:6+7−1−2=10
- 第 9 个数:第 2∼8 个数为 2,3,4,5,6,7,10,最大两个 7+10=17,最小两个 2+3=5,故为 17−5=12
- 第 10 个数:第 3∼9 个数为 3,4,5,6,7,10,12,最大两个 10+12=22,最小两个 3+4=7,故为 22−7=15
解题思路
核心思想
第 i 项只依赖前面最近连续 7 个数,因此不需要保存完整数列。维护一个长度为 7 的滑动窗口即可。
每次计算下一项时,在窗口中扫描一遍,找出最大的两个数和最小的两个数,然后按公式:
next = 最大值1 + 最大值2 - 最小值1 - 最小值2
得到新值,再将窗口最早的数移出,把新值放入窗口末尾。
算法步骤
- 如果
n <= 7,直接返回n。 - 初始化窗口为
[1,2,3,4,5,6,7]。 - 从第
8项开始递推到第n项。 - 每轮扫描窗口,更新最小两项和最大两项。
- 计算新项并滑动窗口。
- 最终窗口末尾就是第
n项。
复杂度分析
由于窗口大小固定为 7:
- 时间复杂度:
O(n) - 空间复杂度:`O
版权声明:
作者:魔改工程师
链接:https://www.sylblog.xin/archives/889
文章版权归作者所有,未经允许请勿转载。
THE END