华为OD机试 2025B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+E卷+B卷+C卷+D卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
小明在做构造数列的题目,题目要求数列中第一个数为n,且数列后面的每一个数字都不能大于前一个数字的一半,数列的元素是正整数,请问在给定n的情况下,最多能构造多少合适且不同的数列?
二、输入描述
输入一个n。
备注:
1 ≤ n ≤ 10000
三、输出描述
输出可以构造的序列个数
四、测试用例
测试用例1:
1、输入
7
2、输出
6
3、说明
可以构成 [7], [7,3], [7,2], [7,1], [7,3,1], [7,2,1]
测试用例2:
1、输入
5
2、输出
4
3、说明
可以构成 [5], [5,2], [5,1], [5,2,1]
五、解题思路
对于数字n,我们需要找出所有可能的递减数列:
- 每个数列都以n开始
- 后续每个数字都不能大于前一个数字的一半
- 所有数字都是正整数
算法思路:
- 使用动态规划,dp[i]表示以数字i开始能构造的不同数列个数
- 对于数字i,dp[i] = 1 + sum(dp[j] for j in [1, i/2])
- 其中1表示只有一个数字i的数列,后面的求和表示所有可能的后续数列
六、Java算法源码
public class OdTest {
/**
* 计算以数字n开始能构造的不同数列个数
* @param n 起始数字
* @return 不同数列的个数
*/
public static int countSequences(int n) {
// dp[i]表示以数字i开始能构造的不同数列个数
int[] dp = new int[n + 1];
// 从1开始计算到n,使用动态规划
for (int i = 1; i <= n; i++) {
// 每个数字本身就是一个数列,所以初始值为1
dp[i] = 1;
// 遍历所有可能的下一个数字j,j的范围是[1, i/2]
for (int j = 1; j <= i / 2; j++) {
// 以j开始的数列个数加到以i开始的数列个数中
dp[i] += dp[j];
}
}
// 返回以n开始的数列个数
return dp[n];
}
/**
* 主函数,处理输入输出
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入的数字n
int n = scanner.nextInt();
// 计算并输出结果
int result = countSequences(n);
System.out.println(result);
scanner.close();
}
}
七、效果展示
1、输入
1
2、输出
1
3、说明
只有数列:[1]
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2025 B卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+E卷+B卷+C卷+D卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。