HJ64 MP3光标位置(java详解)
Posted ~~蓝~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HJ64 MP3光标位置(java详解)相关的知识,希望对你有一定的参考价值。
就是一块诺基亚手机屏幕,只能显示四个歌曲,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);
华为机试 HJ64 MP3光标位置
题目链接
MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第1首歌。
现在要实现通过上下键控制光标移动来浏览歌曲列表,控制逻辑如下:
歌曲总数<=4的时候,不需要翻页,只是挪动光标位置。
光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。
其他情况下用户按Up键,光标挪到上一首歌曲;用户按Down键,光标挪到下一首歌曲。
2. 歌曲总数大于4的时候(以一共有10首歌为例):
特殊翻页:屏幕显示的是第一页(即显示第1 – 4首)时,光标在第一首歌曲上,用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌),同时光标放到最后一首歌上。同样的,屏幕显示最后一页时,光标在最后一首歌曲上,用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。
一般翻页:屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,用户按Up键后,屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。光标当前屏幕的最后一首歌时的Down键处理也类似。
其他情况,不用翻页,只是挪动光标就行。
数据范围:命令长度1≤s≤100 ,歌曲数量1≤n≤150
进阶:时间复杂度:O(n) ,空间复杂度:O(n)
输入描述:
输入说明:
1 输入歌曲数量
2 输入命令 U或者D
输出描述:
输出说明
1 输出当前列表
2 输出当前选中歌曲
示例1
输入:
10
UUUU
输出:
7 8 9 10
7
solution:一种模拟滑窗
#include <iostream>
using namespace std;
int main()
int n, now = 1;
string s;
cin >> n >> s;
if (n <= 4)
for (int i = 0; i < s.length(); ++i)
if (s[i] == 'U')--now;
else ++now;
if (now == 0)now = n;
else if (now == n + 1)now = 1;
for (int i = 1; i <= n; ++i)
if (i != 1)cout << ' ';
cout << i;
cout << endl;
else
int l = 1, r = 4;
for (int i = 0; i < s.length(); ++i)
if (s[i] == 'U')--now;
else ++now;
if (now == 0)
l = n - 4 + 1;
r = n;
now = n;
else if (now == l - 1)
l--;
r--;
else if (now == n + 1)
l = 1;
r = 4;
now = 1;
else if (now == r + 1)
++l;
++r;
for (int i = l; i <= r; ++i)
if (i != l)cout << ' ';
cout << i;
cout << endl;
cout << now << endl;
return 0;
// 64 位输出请用 printf("%lld")
以上是关于HJ64 MP3光标位置(java详解)的主要内容,如果未能解决你的问题,请参考以下文章