就是一块诺基亚手机屏幕,只能显示四个歌曲,upper代表屏幕显示第一个歌曲(总歌曲中第几个),down代表屏幕显示的最后一个歌曲(总歌曲中第几个)
你要输入这个总歌曲数量n
{初始值,cur=0,upper=0,down=Math.min(3,n-1);}{为啥cur为0,例如打开QQ音乐光标不都是显示在第一个歌曲位置嘛}
你有两种操作,U或者D,分别代表当前光标向上移动一个歌曲,向下移动一个歌曲
但是移动光标会有四种特殊情况去引起屏幕中四首歌曲刷新.
第一种情况,cur(光标)位于0处(总歌曲第一个歌曲位置)你又想向上翻页,那么upper屏幕最上面肯定是第n-3个,down为第n个(序号从0开始,所以表示为upper=n-4,down=n-1)
第二种情况,cur(光标)位于n-1处(总歌曲最后一个歌曲位置)你又想向下翻页,那么upper屏幕最上面肯定是第1个,down为第4个(序号从0开始,所以表示为upper=0,down=3)
第三种情况,cur(光标) 0<cur&&cur<n 但是cur位于当前屏幕显示的歌曲第一个位置处 cur=upper 那你想向上翻页,那么屏幕肯定又要更新歌曲啊,所以upper–,down–;
第四种情况,cur(光标) 0<cur&&cur<n 但是cur位于当前屏幕显示的歌曲最后一个位置处 cur=down 那你想向下翻页,那么屏幕肯定又要更新歌曲啊,所以upper++,down++;
还有第五种情况,就是前四种都不满足,那么肯定光标cur向上,向下,屏幕四个歌曲都不会动,那只能 0<cur&&cur<n 而且 upper<cur<down 在屏幕中间第二,第三个位置啊(屏幕只能显示4个歌曲)
所以五种情况讲完,下面看代码了,
public static void main(String[] args) {Scanner sc = new Scanner(System.in);int cur = 0;int upper = 0;int down = 0;int n = Integer.parseInt(sc.nextLine());char[] ch = sc.nextLine().toCharArray();down = Math.min(3, n - 1);for (char res : ch) {int move = res == 'U' ? -1 : 1;if (n > 4) {if (cur == 0 && move == -1) {upper = n - 4;down = n - 1;} else if (cur == n - 1 && move == 1) {upper = 0;down = 3;} else if (cur == upper && move == -1) {upper--;down--;} else if (cur == down && move == 1) {upper++;down++;}}cur = (cur + move + n) % n;}StringBuilder sb = new StringBuilder();for (int i = upper; i <= down; i++) {sb.append(i + 1).append(' ');}System.out.println(sb);System.out.println(cur + 1);}