解题思路:
模拟整个过程处理。情况分为歌曲数小于等于4和大于4两种情况,每种情况都要考虑特殊翻页、一般翻页、其他。用n表示歌曲总数,first表示当前页面的第一首歌,num表示当前选中的歌。
算法流程:
- 当歌曲数小于等于4时:特殊向上翻页,移动光标到最后一首歌;特殊向上翻页,移动光标到第一首歌;一般向上翻页,光标向上移动一格;一般向下翻页,光标向下移动一格;
- 当歌曲数大于4时:特殊向上翻页,光标移动到最后一首歌,最后一页第一首歌为n-3;特殊向下翻页,光标移动到第一首歌,第一页第一首歌为1;一般向上翻页,光标向上移一格,当前页第一首歌和光标位置相同;一般向下翻页,光标向下移一格,当前页第一首歌位置也向下移一格;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String ops = sc.next();
// 模拟翻页
Page page = new Page(n);
for (int i = 0; i < ops.length(); i++) {
if ('U' == ops.charAt(i)) {
page.up();
} else {
page.down();
}
}
// 输出结果
for (int i = page.top; i <= page.floor; i++) {
System.out.print(i);
if (i != page.floor) {
System.out.print(" ");
}
}
System.out.println();
System.out.println(page.cur);
}
}
// 模拟翻页对象
class Page {
int top;
int floor;
final int n;
int cur;
public Page(int n) {
this.n = n;
cur = top = 1;
floor = Math.min(n, 4);
}
public void up() {
cur --;
if (cur == 0) {
cur = n;
}
if (n > 4) {
if (cur == n) {
floor = n;
top = n - 3;
} else if (cur < top) {
top --;
floor --;
}
}
}
public void down() {
cur ++;
if (cur == n + 1) {
cur = 1;
}
if (n > 4) {
if (cur == 1) {
top = 1;
floor = 4;
} else if (cur > floor) {
top ++;
floor ++;
}
}
}
}