豆包24 小R的随机播放顺序

128 阅读2分钟

问题描述

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

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

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

算法选择

模拟

算法思路

    • 创建一个长度为n的数组ans,用于存储最终的播放顺序。
    • 创建一个ArrayList,将歌单a中的所有歌曲添加到这个列表中。
  1. 模拟播放过程

    • 使用一个循环,从0到n-1(包含n-1),模拟播放每一首歌的过程。

    • 在每次循环中,将当前列表中的第一首歌曲(索引i处的歌曲)添加到ans数组中,这表示当前播放的歌曲。

    • 如果当前是最后一首歌(即i == n-1),则不需要移动歌曲,直接结束循环。

    • 如果不是最后一首歌,执行以下操作:

      • 获取下一首歌的ID(列表中索引i+1处的歌曲)。
      • 从列表中移除当前播放的歌曲(索引i+1处的歌曲)。
      • 将移除的歌曲添加到列表的末尾。
  2. 返回结果

    • 循环结束后,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 }));
    }
}