题解 | #MP3光标位置#
MP3光标位置
https://www.nowcoder.com/practice/eaf5b886bd6645dd9cfb5406f3753e15
用数组的方式,比用迭代器简单太多了!
思路:注意三个变量-当前音乐、当前显示列表、当前选中的显示的列表的index,给这三个变量赋个初始值,在逐个处理命令的循环体中注意分情况改变这三个变量值即可。
import java.util.Arrays;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) { // 注意 while 处理多个 case
int b = Integer.parseInt(in.nextLine());
String a = in.nextLine();
new Main().MP3cursor(b, a);
}
}
void MP3cursor(int n, String cmd) {
int[] out = new int[4];//最后要输出的显示列表
int nowmusic = 1;//当前选中的音乐
out[0] = nowmusic;
out[1] = nowmusic + 1;
out[2] = nowmusic + 2;
out[3] = nowmusic + 3;
int xuanzhongindx = 0;//当前显示列表中选中的那条的index
for (int i = 0; i < cmd.length(); i++) {
char cmdc = cmd.charAt(i);
if (cmdc == 'U') {//处理命令为U的情况
if (nowmusic == 1) {//执行命令前选中的为第一首,要整体翻页,选中项改为翻页后的最下边一条
nowmusic = n;
out[3] = nowmusic;
out[2] = nowmusic - 1;
out[1] = nowmusic - 2;
out[0] = nowmusic - 3;
xuanzhongindx = 3;
} else {//执行命令前选中的不是第一首,当前歌曲直接切换为上一首
nowmusic -= 1;
if (xuanzhongindx == 0) {//若执行命令前选中的为最上边一条,需修改显示列表,否则只用修改选中index
out[0] = nowmusic;
out[1] = nowmusic + 1;
out[2] = nowmusic + 2;
out[3] = nowmusic + 3;
} else {
xuanzhongindx -= 1;
}
}
}
if (cmdc == 'D') {//处理命令为D的情况
if (nowmusic == n) {
nowmusic = 1;
out[0] = nowmusic;
out[1] = nowmusic + 1;
out[2] = nowmusic + 2;
out[3] = nowmusic + 3;
xuanzhongindx = 0;
} else {
nowmusic += 1;
if (xuanzhongindx == 3) {
out[3] = nowmusic;
out[2] = nowmusic - 1;
out[1] = nowmusic - 2;
out[0] = nowmusic - 3;
} else {
xuanzhongindx += 1;
}
}
}
}
if (n <= 4) {//歌曲数量小于一页时,无论执行多少命令,显示列表都不变
for (int i = 0; i < n; i++) {
System.out.printf("%d ", i + 1);
}
System.out.println();
} else {
Arrays.stream(out).forEach(ff->System.out.printf("%d ", ff));
System.out.println();
}
System.out.println(nowmusic);
}
}
查看4道真题和解析