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); } }