解题思路
算法类型:模拟 / 递推(数组维护 + 固定窗口取最值)
数列的生成规则是:前 7 项固定为 1,2,3,4,5,6,7,从第 8 项起,每一项只由它前面最近连续 7 个已生成的值决定——取这 7 个数中最大的两个之和减去最小的两个之和。
关键观察:
- 窗口是滑动的。第 i 项要看的窗口是 ai−7,ai−1,…,ai−1 这连续 7 项,其中包含已经算出的新数(例如第 9 项要看第 2∼8 项,而第 8 项 =10 是刚递推出的)。不能误以为“每次都用初始的 1∼7 计算”,那样第 9 项之后全会算错。
题目内容
有一个连续的数列,它的前 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 个位置上的数值
输入描述
输入一个整数 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