我感觉我这个容易理解
MP3光标位置
https://www.nowcoder.com/practice/eaf5b886bd6645dd9cfb5406f3753e15
1.一共有4个格子对应4首歌,格子位置为0,1,2,3。只有在第一首往上翻(U)时,格子位置对应到3(歌曲数小于4对应到歌曲数-1),当最后一首往下翻(D)时,格子位置对应到0。在格子位置为0且非第一首歌,或者在格子位置为3且非最后一首歌,往上或往下翻时无需改动对应的格子位置。如果是其他情况,该加加,该减的减。
2.一共有n首歌。从1到n。默认是位置是1,U和D就对应减加。只有在第一首往上翻(U)时,位置对应到n,当最后一首往下翻(D)时,位置对应到1。其他就是加1减1。
3.通过知道的格子位置和对应的歌曲,进行上下补全即可
import java.util.ArrayList; import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); //1 输入歌曲数量:1≤n≤150 int n = in.nextInt(); // 在当前页的格子位置,默认第一格(共4个格子) int pageIndex = 0; // 对应的歌曲,默认第一首 int index = 1; //2 输入命令 U或者D String string = in.next(); char[] charArray = string.toCharArray(); for (int i = 0; i < charArray.length; i++) { char c = charArray[i]; // 第一首歌 if (c == 'U' && index == 1) { index = n; // 注意:跳到最后一页时,歌曲列表一定是满的,也就是说,即使按照4首为一组, // 当最后一组不足4首歌时,从第一首歌往上翻页会进行补全为4首歌。除非总歌曲数<4 if(n < 4){ pageIndex = n - 1; }else { pageIndex = 3; } continue; } // if (c == 'D' && index == n) { index = 1; pageIndex = 0; continue; } if (c == 'U') { if (pageIndex != 0) { pageIndex--; } index--; } if (c == 'D') { if (pageIndex != 3) { pageIndex++; } index++; } } // 补全其他格子的歌曲 int[] currentArr = new int[4]; for (int i = 0; i < 4; i++) { if (i == pageIndex) { currentArr[i] = index; // 根据知道的第几格和对应的歌曲进行上下补全 int upIndex = index; int downIndex = index; for (int j = pageIndex - 1; j >= 0; j--) { // 往上面补全格子肯定没问题 currentArr[j] = --upIndex; } for (int j = pageIndex + 1; j < 4; j++) { // 往下注意达到最大了,但是格子未满的情况。比如3首歌时 if (downIndex == n) { break; } currentArr[j] = ++downIndex; } } } // 结果打印 StringBuilder builder = new StringBuilder(); for (int i = 0; i < currentArr.length; i++) { // 注意:如果格子(一共4格)未满的情况。比如总歌曲数为1~3 if (currentArr[i] == 0){ break; } if (i == currentArr.length - 1){ builder.append(currentArr[i]); continue; } builder.append(currentArr[i]).append(" "); } System.out.println(builder); System.out.println(index); } }