小R的随机播放顺序 | 豆包MarsCode AI刷题

57 阅读2分钟

题目内容

小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排序自己定义排序方法。在此推荐大家去学习。