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详解)的主要内容,如果未能解决你的问题,请参考以下文章

华为机试HJ64:MP3光标位置

#yyds干货盘点# 解决华为机试:MP3光标位置

(MP3) 如何在 Java 中计算字节位置

每日一题 | day21(洗牌 | MP3光标位置)

设置和获取光标位置?带有 OpenGL 的 JAVA

Java:光标当前位置的列号和行号