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

34 阅读2分钟

题目要求我们实现一个函数 solution,该函数接受一个整数 n 和一个包含 n 个整数的向量 a,表示歌单中的歌曲ID。播放规则如下:

  1. 首先播放歌单中的第一首歌,播放后将其从歌单中移除。
  2. 如果歌单中还有歌曲,则将当前第一首歌移到最后一首。
  3. 重复上述过程,直到歌单中没有任何歌曲。

例如,给定歌单 [5, 3, 2, 1, 4],真实的播放顺序是 [5, 2, 4, 1, 3]

解题思路

  1. 初始化:我们需要一个结果向量 result 来存储实际的播放顺序。
  2. 循环处理:使用一个 while 循环来处理歌单,直到歌单为空。
  3. 播放当前第一首歌:将当前歌单的第一首歌添加到 result 中,并从歌单中移除。
  4. 调整歌单:如果歌单中还有歌曲,将当前的第一首歌移到最后一首。
#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;
}

详细解释

  1. 初始化:我们定义了一个 result 向量来存储播放顺序。

  2. 循环处理:使用 while 循环来处理歌单,直到歌单为空。

  3. 播放当前第一首歌

    • 使用 a.front() 获取当前歌单的第一首歌。
    • 使用 result.push_back(a.front()) 将这首歌添加到 result 中。
    • 使用 a.erase(a.begin()) 将这首歌从歌单中移除。
  4. 调整歌单

    • 使用 if (!a.empty()) 检查歌单中是否还有歌曲。
    • 如果还有歌曲,使用 a.front() 获取当前的第一首歌。
    • 使用 a.erase(a.begin()) 将这首歌从歌单中移除。
    • 使用 a.push_back(first_song) 将这首歌移到歌单的最后一首。

注意事项

  1. 边界条件:当歌单中只有一首歌时,直接播放这首歌即可,不需要进行后续的调整操作。
  2. 效率考虑:在处理大规模数据时,频繁使用 erase 和 push_back 操作可能会导致性能下降。可以考虑使用双端队列 deque 来优化性能。
  3. 代码可读性:保持代码的清晰和简洁,有助于提高代码的可维护性和可读性。

总结

通过这道题目的练习,我们可以加深对数据结构和算法的理解,特别是对向量和循环的使用。同时,这道题也提醒我们在处理动态数据时,需要注意边界条件和性能优化。