问题描述
小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。
例如,给定歌单 [5, 3, 2, 1, 4],真实的播放顺序是 [5, 2, 4, 1, 3]。
保证歌曲中的id两两不同。
题目分析:
- 目标:实现一个按照特定规则进行歌曲随机播放的功能。具体规则是先播放歌单中的第一首歌,然后将其从歌单移除,如果歌单还有其他歌曲,就把当前的第一首歌移到最后一首,如此循环直至歌单为空,最后得到实际的播放顺序。
- 输入:一个整数
n表示歌单中歌曲的数量,以及一个包含n个不同整数的向量a,其中每个整数代表一首歌曲的唯一标识(id),用来表示初始的歌单。 - 输出:一个向量,表示按照特定规则播放歌曲的实际顺序。
代码展示:
std::vector<int> solution(int n, std::vector<int> a) {
std::queue<int> q;
std::vector<int> result;
// 将所有歌曲加入队列
for (int song : a) {
q.push(song);
}
while (!q.empty()) {
// 播放第一首歌
result.push_back(q.front());
q.pop();
// 如果还有歌曲,将当前第一首歌移到最后一首
if (!q.empty()) {
int next = q.front();
q.pop();
q.push(next);
}
}
return result;
}
-
变量定义:
std::queue<int> q;:定义了一个整数类型的队列q,用于模拟歌单。歌曲将按照规则在这个队列中进行操作。std::vector<int> result;:定义了一个整数类型的向量result,用于存储最终的播放顺序。
-
将歌曲加入队列:
- 通过循环
for (int song : a),将输入的歌单向量a中的每一首歌曲依次加入到队列q中。这样就完成了歌单在队列中的初始化。
- 通过循环
-
按照规则播放歌曲并调整队列:
-
在
while (!q.empty())循环中,只要队列不为空,就会执行以下操作:result.push_back(q.front()); q.pop();:首先将队列q的队首歌曲(即当前歌单中的第一首歌)添加到result向量中,这表示播放了这首歌,然后将其从队列中弹出,模拟从歌单中移除。if (!q.empty()) { int next = q.front(); q.pop(); q.push(next); }:如果队列在弹出一首歌曲后仍然不为空,那么就获取当前队列的队首歌曲(此时它已经变成了原来的第二首歌),将其先弹出,然后再推到队列的末尾,模拟将当前第一首歌移到最后一首的规则。
-
-
返回播放顺序:
- 当队列
q为空时,循环结束,函数返回result向量,这个向量中存储的就是按照特定规则播放歌曲的实际顺序。
- 当队列