题目内容
小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。
例如,给定歌单 [5, 3, 2, 1, 4],真实的播放顺序是 [5, 2, 4, 1, 3]。
保证歌曲中的id两两不同。
题目分析理解
我们需要模拟一个特殊的随机播放规则。使用c++ STL中队列更为方便。首先,将所有歌曲的ID放入队列中。其次,从队列中取出第一首歌并播放。如果队列中还有歌曲,将当前队列的第一首歌移到队列的末尾。重复上述步骤,直到队列为空。同时,在每次播放歌曲时,记录下该歌曲的ID。
c++代码
话不多说直接上代码
#include <iostream>
#include <vector>
#include <queue>
std::vector<int> solution(int n, std::vector<int> a) {
std::queue<int> q;
for (int i : a) {
q.push(i);
}
std::vector<int> b;
while (!q.empty()) { //过程模拟
int c = q.front(); //首歌曲播放
q.pop();
b.push_back(c);
if (!q.empty()) { //判断队列不为空,则将当前第一首歌移到队列末尾,然后继续循环
int n = q.front();
q.pop();
q.push(n);
}
}
return b;
}
int main() {
std::vector<int> result1 = {5, 2, 4, 1, 3};
std::vector<int> result2 = {4, 3, 1, 2};
std::vector<int> result3 = {1, 3, 5, 2, 6, 4};
std::cout << (solution(5, {5, 3, 2, 1, 4}) == result1) << std::endl;
std::cout << (solution(4, {4, 1, 3, 2}) == result2) << std::endl;
std::cout << (solution(6, {1, 2, 3, 4, 5, 6}) == result3) << std::endl;
}
代码解释
用c++ STL 中的队列构建并用动态数组存储歌曲ID,然后再进行模拟,将当前播放的歌曲ID记录到结果数组中。
核心
在将当前第一首歌移到队列末尾之前,检查队列是否为空。如果队列为空,则不进行任何操作。不为空时,将当前队列的第一个元素移到队列末尾。
代码提示
以下是代码的框架,其中关键步骤用注释标出:
总结
- 需有一定的理解题目能力
- 如果能够熟练使用STL利用动态数组与队列模拟会很容易
延伸思考
STL是C++标准库中的一部分,它包含了一系列通用数据结构和算法的模板类和函数,包括容器(如vector、list、map等)、算法(如排序、搜索、遍历等)和迭代器等,对于STL有很多方便的函数如果熟练掌握STL对于写题会有很大的帮助。例如如果需要排序可以直接用sort排序自己定义排序方法。在此推荐大家去学习。