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

得到新值,再将窗口最早的数移出,把新值放入窗口末尾。

算法步骤

  1. 如果 n <= 7,直接返回 n。
  2. 初始化窗口为 [1,2,3,4,5,6,7]。
  3. 从第 8 项开始递推到第 n 项。
  4. 每轮扫描窗口,更新最小两项和最大两项。
  5. 计算新项并滑动窗口。
  6. 最终窗口末尾就是第 n 项。

复杂度分析

由于窗口大小固定为 7:

  • 时间复杂度:O(n)
  • 空间复杂度:`O
THE END