小R的随机播放顺序 | 青训营刷题

100 阅读2分钟

问题描述

小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 向量,这个向量中存储的就是按照特定规则播放歌曲的实际顺序。