题解 | #MP3光标位置#
MP3光标位置
https://www.nowcoder.com/practice/eaf5b886bd6645dd9cfb5406f3753e15
穷举法,当歌曲数小于4时,不用翻页,有两种特殊情况:1、光标在第一首歌,2、光标在第二首歌,记住光标位置就可以了;当歌曲数大于4时,有四种特殊情况:1、光标在第一首歌 2、光标在第二首歌 3、光标在页的第一首歌,且不在第一页 4、光表在页面的最后一首歌,且页数不在最后一页
代码如下:
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 a = in.nextInt();
String str = in.next().toUpperCase();
turnPages(a, str);
}
}
private static void turnPages(int a, String str) {
//光标,指向第几首歌
int signal = 1;
//当歌曲书小于4首时
if (a <= 4) {
for (int i = 0; i < str.length(); i++) {
//光标在第一首时,向上操作
if (str.charAt(i) == 'U' && signal == 1) {
signal = a;
//光标在最后一首时,向下操作
} else if (str.charAt(i) == 'D' && signal == a) {
signal = 1;
//向上操作
} else if (str.charAt(i) == 'U') {
signal--;
//向下操作
} else {
signal++;
}
}
for (int i = 0; i < a; i++) {
System.out.print(i + 1 + " ");
}
System.out.println("\n" + signal);
return;
}
//歌曲大于4时
// int[] currentPageList = new int[4];
// currentPageList[0] = 1;
int first = 1;
for (int i = 0; i < str.length(); i++) {
//光标在第一首时,向上操作
if (str.charAt(i) == 'U' && signal == 1) {
signal = a;
first = a - 3;
//光标在最后一首时,向下操作
} else if (str.charAt(i) == 'D' && signal == a) {
signal = 1;
first = 1;
//向上操作,且光标在页面第一首歌时
} else if (str.charAt(i) == 'U' && signal == first) {
signal--;
first = signal;
//向下操作,且光标在页面最后一首歌时
} else if (str.charAt(i) == 'D' && signal == first + 3) {
signal++;
first++;
//向上操作
} else if (str.charAt(i) == 'U') {
signal--;
//向下操作
} else {
signal++;
}
}
for (int i = 0; i < 4; i++) {
System.out.print(first + i + " ");
}
// System.out.print("" + first + ' ' + (first + 1) + ' ' + (first + 2) + ' ' +
// (first + 3) + "\n");
System.out.println("\n" + signal);
}
}
复杂度分析:
时间复杂度:O(n), 其中n为命令字符串的长度,需要遍历n个命令。
空间复杂度:O(1), 直接判断,无额外空间。

