青训营中等题 2| 豆包MarsCode AI刷题

16 阅读2分钟

小R的随机播放顺序

问题描述

*小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。

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

保证歌曲中的id两两不同。*


测试样例

样例1:

输入:n = 5 ,a = [5, 3, 2, 1, 4]

输出:[5, 2, 4, 1, 3]

样例2:

输入:n = 4 ,a = [4, 1, 3, 2]

输出:[4, 3, 1, 2]

样例3:

输入:n = 6 ,a = [1, 2, 3, 4, 5, 6]

输出:[1, 3, 5, 2, 6, 4]

题目分析:

遍历数组,遍历到第i个元素时,则第i+1个元素要排到最后

初始想法:

用一个数组存储这些数据,下标为偶数的先一次存放

5 2 4

为奇数的重新遍历(3 1)

重新来

3

重新来

1

得出 5 2 4 3 1

后来想着分奇偶数,感觉有点麻烦,在纸上画个图,巧,这道题目是在队列标签下看到的,往这方面想

队列思想:

将所有元素放入队列中 头>5 3 2 1 4>尾

每次被移除的序号(被播放过的歌)存放在数组b中

过程分析(以样例1为例):

5 2 4 1 3

第一首播放5,出队,用一个变量x存储下一首歌曲3,3出队,重新将其放入队尾

2 1 4 3

第二首播放2,出队,用一个变量x存储下一首歌曲1,1出队,重新将其放入队尾

4 3 1

第三首播放4,出队,用一个变量x存储下一首歌曲3,3出队重新将其放入队尾,

1 3

第四首播放1,出队,用一个变量x存储下一首歌曲3,3出队重新将其放入队尾

3

第五首播放3,出队,队列为空,跳出队列的访问

结果:

5 2 4 1 3

代码:

    // write code here
     queue<int>q;
     for(int i=0;i<n;i++){
        q.push(a[i]);
     }
     vector<int>b;
     while(!q.empty()){
        b.push_back(q.front());
        q.pop();
        int x=q.front();
        q.pop();
        q.push(x);
     }
    return b;
}

队列的使用方法:

定义 queue<int(类型)>q(队列名);

入队 q.push(元素);

出队 q.pop();

获取队头 q.front();

获取队尾 q.back();

空队列 q.empty();

队列长度 q.size();

青训营感悟:

青训营打卡接近尾声啦,开始时还不能坚持每天刷题,觉得会难,后来尝试着做发现还是有不少题目可以完成的,开始写这个笔记时间有点晚,不过最近也在通过笔记梳理自己学到的知识,以后翻阅也能有所启发。

上述若有问题,欢迎友友指出!