bluecode-数字增殖问题
问题描述
给定一个正整数 n
,定义一次"增殖"操作如下:
- 将数字
n
转化为一个包含1
到n
的递增序列 - 例如:当
n = 4
时,一次增殖后变为序列[1, 2, 3, 4]
现给定三个正整数:
- 初始数字
n
- 增殖次数
k
- 位置索引
p
(从1开始计数)
请计算经过 k
次增殖操作后,序列中第 p
个位置的数字。如果 p
超出序列长度,则返回 -1
。
示例说明
示例 1:
测试样例
样例1:
输入:
n = 4 ,k = 3 ,p = 19
输出:3
解释:
第1次增殖:4 -> [1,2,3,4]
第2次增殖:[1,2,3,4] -> [1, 1,2, 1,2,3, 1,2,3,4]
第3次增殖:得到最终序列 [1, 1, 1,2, 1, 1,2, 1,2,3, 1, 1,2, 1,2,3, 1,2,(3),4] -> ,第19个位置的数字是3
样例2:
输入:
n = 3 ,k = 2 ,p = 5
输出:2
解释:
第1次增殖:3 -> [1,2,3]
第2次增殖:[1,2,3] -> [1, 1,2, 1,(2),3]
第5个位置的数字是2
样例3:
输入:
n = 5 ,k = 1 ,p = 7
输出:-1
解释:
第1次增殖:5 -> [1,2,3,4,5]
序列长度为5,p=7超出范围,返回-1
#include <iostream>
#include <vector>
using namespace std;
int solution(int n, int k, int p) {
// 初始序列只有一个数字 n
vector<int> seq = {n};
// 进行 k 次增殖
for (int i = 0; i < k; i++) {
vector<int> new_seq; // 存储新的序列
// 对当前序列的每个数字进行增殖
for (int x : seq) {
for (int j = 1; j <= x; j++) {
new_seq.push_back(j); // 生成 [1, 2, ..., x] 并加入新序列
}
}
seq = new_seq; // 更新序列为新序列
}
// 检查 p 是否在范围内(p 从 1 开始计数)
if (p > seq.size() || p < 1) {
return -1;
}
// 返回第 p 个位置的数字(索引从 0 开始,所以用 p-1)
return seq[p - 1];
}
int main() {
// Add your test cases here
std::cout << (solution(4, 3, 19) == 3) << std::endl;
return 0;
}