使用 Golang 实现一个方法 func checkList(list []int)(val int,ok bool),输入为一个整数数列(list []int),输出为预测改数列的下一个项的值 val 和是否找到规律 ok 比如 输入 []int{1,3,5,7,9} ,检测出它是等差数列,输出下一项的值 11 和找到了规律 true 输入数列的长度小于 3 时,作 无规律处理。比如:[1,3]判定无规律。[1,3,5]判定为等差数列 不用考虑 int 计算的溢出问题 需要支持的数列
等差数列:递增和递减的等差数列都需要支持
比如 [3,5,7,9,11],最终返回 13 和 true
比如 [11,9,7,5,3],最终返回 1 和 true
等比数列: 比如 [2,4,8,16,32],最终返回 64 和 true
等比数列的公比可以为负整数,但不能为小数
比如 [32,16,8,4,2],返回 0 和 false 即可
比如 [2,-4,8,-16,32],需返回 -64 和 true
开方等差数列: 如果一个数列可以对每一项开根号(比如负数,则认为不可以开根号,再比如 3,开根号无法得到整数,也认为不可以开根号。开根号只取正值,比如根号 4=2,不能等于-2 )并且得到的新的整数数列是等差数列,那么他就是开方等差数列,比如 [1,4,9,16,25],最终返回 36 和 true
上述三种数列的任意组合,可以多层嵌套
比如 [2,15,41,80] 先求两两之差,得到等差数列 [13,26,39],最终返回 132 和 true
比如 [1,2,6,15,31] 先求两两之差,得到平方等差数列 [1,4,9,16],最终返回 56 和 true
比如 [1,1,3,15,105,945] 先求两两之商,得到等差数列[1,3,5,7,9],最终返回 10395 和 true
比如 [2,14,64,202,502,1062,2004],先求两两之差,得到 [12,50,138,300,560,942],再求两两之差,得到 [38,88,162,260,382],再求两两之差,得到等差数列[50,74,98,122],最终返回 3474 和 true
无规律:其他所有未检查出规律的数列,最终返回 0 和 false
当数列同时满足多种规律时,同一级之间按照 等差数列 > 等比数列 > 开方等差数列 的优先级来计算。比如 [1,1,2,6],可以先求差,得到 [0,1,4] 得到平方等差数列,预测的结果为 15 。也可以先求商得到 [1,2,3] 是等差数列,预测的结果为 24 。按照优先级规则,返回先求等差的结果。所以 输入 [1,1,2,6],输出应该为 15 。
1
Zhuzhuchenyan 2021-07-31 16:20:14 +08:00
看到这题感觉回到了大学。
如果仅仅要求支持以上的几种形态的话,简单的做法就是定义等差,等比,开方等差的规则,然后判断当前数列不满足条件时,做差去递归求解就是了。别忘了加上最大递归层数的限制。后期如果增加需求加规则就好了。 不想要仅仅如此的话可以看一下如何做一个求解器,举个现成的例子,你在 wolfram alpha 上直接搜索 1,3,5,7,9,他就会提示你这是个等差数列,并给出通项公式,网址: https://www.wolframalpha.com/input/?i=3%2C5%2C7%2C9%2C11 最后,作业还是自己做吧。 |
2
nowgoo 2021-08-01 21:48:17 +08:00
|