小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();
青训营感悟:
青训营打卡接近尾声啦,开始时还不能坚持每天刷题,觉得会难,后来尝试着做发现还是有不少题目可以完成的,开始写这个笔记时间有点晚,不过最近也在通过笔记梳理自己学到的知识,以后翻阅也能有所启发。
上述若有问题,欢迎友友指出!