问题描述
小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。
例如,给定歌单 [5, 3, 2, 1, 4],真实的播放顺序是 [5, 2, 4, 1, 3]。
保证歌曲中的id两两不同。
算法选择
模拟
算法思路
-
- 创建一个长度为
n的数组ans,用于存储最终的播放顺序。 - 创建一个
ArrayList,将歌单a中的所有歌曲添加到这个列表中。
- 创建一个长度为
-
模拟播放过程:
-
使用一个循环,从0到
n-1(包含n-1),模拟播放每一首歌的过程。 -
在每次循环中,将当前列表中的第一首歌曲(索引
i处的歌曲)添加到ans数组中,这表示当前播放的歌曲。 -
如果当前是最后一首歌(即
i == n-1),则不需要移动歌曲,直接结束循环。 -
如果不是最后一首歌,执行以下操作:
- 获取下一首歌的ID(列表中索引
i+1处的歌曲)。 - 从列表中移除当前播放的歌曲(索引
i+1处的歌曲)。 - 将移除的歌曲添加到列表的末尾。
- 获取下一首歌的ID(列表中索引
-
-
返回结果:
- 循环结束后,
ans数组中存储的就是按照小R的规则播放的顺序,返回这个数组。
- 循环结束后,
代码展示
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static int[] solution(int n, int[] a) {
int[] ans = new int[n];
List<Integer> list = new ArrayList<>();
for(int num: a){
list.add(num);
}
for(int i = 0; i < n; i++){
ans[i] = list.get(i);
if(i == n-1){
break;
}
int tem = list.get(i+1);
list.remove(i+1);
list.add(tem);
}
return ans;
}
public static void main(String[] args) {
System.out.println(Arrays.equals(solution(5, new int[] { 5, 3, 2, 1, 4 }), new int[] { 5, 2, 4, 1, 3 }));
System.out.println(Arrays.equals(solution(4, new int[] { 4, 1, 3, 2 }), new int[] { 4, 3, 1, 2 }));
System.out.println(Arrays.equals(solution(6, new int[] { 1, 2, 3, 4, 5, 6 }), new int[] { 1, 3, 5, 2, 6, 4 }));
}
}