24小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]
Java代码实现
import java.util.Arrays;
import java.util.LinkedList;
public class Main {
public static int[] solution(int n, int[] a) {
// 使用LinkedList来模拟队列操作
LinkedList<Integer> songQueue = new LinkedList<>();
for (int song : a) {
songQueue.add(song);
}
// 用于存储播放顺序
int[] result = new int[n];
int index = 0;
// 模拟播放过程
while (!songQueue.isEmpty()) {
// 取出队列中的第一首歌,并将其加入结果数组
int currentSong = songQueue.poll();
result[index++] = currentSong;
// 如果队列中还有歌曲,将当前队列的第一首歌移到队列的末尾
if (!songQueue.isEmpty()) {
int nextSong = songQueue.poll();
songQueue.add(nextSong);
}
}
return result; // 返回最终的播放顺序
}
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}));
}
}
代码解释
1. 使用LinkedList
模拟队列
-
LinkedList
类实现了Queue
接口,可以方便地模拟队列操作。 -
使用
add()
方法将元素添加到队列末尾。 -
使用
poll()
方法从队列中移除并返回第一个元素。
2. 模拟播放过程
-
每次从队列中取出第一首歌(
poll()
),并将其加入结果数组。 -
如果队列中还有歌曲,将当前队列的第一首歌移到队列的末尾(再次使用
poll()
和add()
)。
3. 测试用例
-
使用
Arrays.equals()
方法比较返回的结果与预期结果是否一致。 -
Arrays.equals()
方法会比较两个数组的内容是否完全一致。
运行结果
运行上述代码后,输出结果如下:
true
true
true
这表明solution
方法的实现是正确的,并且能够正确地模拟歌单的播放顺序。
注意事项
-
在Java中,
LinkedList
是一个双向链表,可以高效地实现队列操作。 -
poll()
方法在队列为空时返回null
,因此在使用时需要确保队列不为空。 -
Arrays.equals()
方法用于比较两个数组的内容是否一致,非常适用于测试数组类型的返回值。
通过上述实现,你可以正确地模拟歌单的播放顺序。