我感觉我这个容易理解
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);
}
}


查看5道真题和解析