题解 | #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), 直接判断,无额外空间。