HJ64MP3光标位置
一、分析题目
屏幕大小固定,通过上下键浏览。
(1)当 总数<=4,此时无翻页。
除特殊情况都可正常移动,i移动就行
特殊情况:i为1,按up,要移动到最后一个,i为4;
i为4,按down,要移动到第一个,i为1
(2)当总数>4,假设为10
翻页:
一般翻页 :比如当前(4,5,6,7)i处于4,
按up 屏幕显示(3,4,5,6)i处于3;
比如当前为(4,5,6,7)i处于7
按down 屏幕显示(5,6,7,8)i处于8
特殊翻页:
i为1,按up,要移动到最后一个,i为10;
i为10,按down,要移动到第一个,i为1
无翻页:
正常移动i
————————————————
关键点:
在本体中长度固定为4,可以看作是一个有限制长度的屏幕,只是这里需要把无法显示的所有内容都放到长度无限的页面上,通过对向上和向下操作进行优化。
通过模拟可知,1、2、3、4这四个数中循环,假设当前位置为i,对于 U 操作指令,光标向上移动一格后的位置为 (i-1-1+n) % n+1;
光标向后移动一格后的位置为 i%n+1。
二、代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
String cmd = sc.next();
parseCmd(cmd, n);
}
}
public static void parseCmd(String commands, int n) {
// 页面的起始位置
int start = 1;
// 页面的末位置
int end = Math.min(n, 4);
// 光标的位置, 三个位置都是从1开始
int index = 1;
for(int i = 0; i < commands.length(); i++) {
// 根据向上移动和向下移动的公式,光标位置的变化
if(commands.charAt(i) == 'U') {
index = (index-1-1+n) % n + 1;
} else if(commands.charAt(i) == 'D') {
index = index % n + 1;
}
// 判断滑动窗口的位置是否需要改变
if(index < start) {
// 光标在窗口之上
start = index;
end = start + 3;
} else if(index > end){
// 光标在窗口之下
end = index;
start = end - 3;
}
}
// 输出窗口内容
for(int i = start; i <= end; i++) {
System.out.print(i + " ");
}
System.out.println();
// 打印当前光标
System.out.println(index);
}
}