题目要求我们实现一个函数 solution,该函数接受一个整数 n 和一个包含 n 个整数的向量 a,表示歌单中的歌曲ID。播放规则如下:
- 首先播放歌单中的第一首歌,播放后将其从歌单中移除。
- 如果歌单中还有歌曲,则将当前第一首歌移到最后一首。
- 重复上述过程,直到歌单中没有任何歌曲。
例如,给定歌单 [5, 3, 2, 1, 4],真实的播放顺序是 [5, 2, 4, 1, 3]。
解题思路
- 初始化:我们需要一个结果向量
result来存储实际的播放顺序。 - 循环处理:使用一个
while循环来处理歌单,直到歌单为空。 - 播放当前第一首歌:将当前歌单的第一首歌添加到
result中,并从歌单中移除。 - 调整歌单:如果歌单中还有歌曲,将当前的第一首歌移到最后一首。
#include <iostream>
#include <vector>
std::vector<int> solution(int n, std::vector<int> a) {
std::vector<int> result;
while (!a.empty()) {
// 将当前歌单的第一首歌添加到结果中
result.push_back(a.front());
// 移除当前歌单的第一首歌
a.erase(a.begin());
// 如果歌单中还有歌曲,则将当前的第一首歌移到最后一首
if (!a.empty()) {
int first_song = a.front();
a.erase(a.begin());
a.push_back(first_song);
}
}
return result;
}
详细解释
-
初始化:我们定义了一个
result向量来存储播放顺序。 -
循环处理:使用
while循环来处理歌单,直到歌单为空。 -
播放当前第一首歌:
- 使用
a.front()获取当前歌单的第一首歌。 - 使用
result.push_back(a.front())将这首歌添加到result中。 - 使用
a.erase(a.begin())将这首歌从歌单中移除。
- 使用
-
调整歌单:
- 使用
if (!a.empty())检查歌单中是否还有歌曲。 - 如果还有歌曲,使用
a.front()获取当前的第一首歌。 - 使用
a.erase(a.begin())将这首歌从歌单中移除。 - 使用
a.push_back(first_song)将这首歌移到歌单的最后一首。
- 使用
注意事项
- 边界条件:当歌单中只有一首歌时,直接播放这首歌即可,不需要进行后续的调整操作。
- 效率考虑:在处理大规模数据时,频繁使用
erase和push_back操作可能会导致性能下降。可以考虑使用双端队列deque来优化性能。 - 代码可读性:保持代码的清晰和简洁,有助于提高代码的可维护性和可读性。
总结
通过这道题目的练习,我们可以加深对数据结构和算法的理解,特别是对向量和循环的使用。同时,这道题也提醒我们在处理动态数据时,需要注意边界条件和性能优化。