HJ64 MP3光标位置 ●●

HJ64 MP3光标位置 ●●

描述

MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第1首歌。

现在要实现通过上下键控制光标移动来浏览歌曲列表,控制逻辑如下:

1、 歌曲总数<=4的时候,不需要翻页,只是挪动光标位置。
光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。
在这里插入图片描述
其他情况下用户按Up键,光标挪到上一首歌曲;用户按Down键,光标挪到下一首歌曲。
在这里插入图片描述
2、 歌曲总数大于4的时候(以一共有10首歌为例):
特殊翻页:屏幕显示的是第一页(即显示第1 – 4首)时,光标在第一首歌曲上,用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌),同时光标放到最后一首歌上。同样的,屏幕显示最后一页时,光标在最后一首歌曲上,用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。
在这里插入图片描述
一般翻页:屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,用户按Up键后,屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。光标当前屏幕的最后一首歌时的Down键处理也类似。
在这里插入图片描述
其他情况,不用翻页,只是挪动光标就行。

数据范围:命令长度 1 ≤ s ≤ 100 1\le s\le 100 1s100,歌曲数量 1 ≤ n ≤ 150 1\le n \le 150 1n150
进阶:时间复杂度: O ( n ) O(n) O(n) ,空间复杂度: O ( n ) O(n) O(n)

输入描述:

1 输入歌曲数量
2 输入命令 U或者D

输出描述:

1 输出当前列表
2 输出当前选中歌曲

示例

输入:
10
UUUU
输出:
7 8 9 10
7

题解

1. 模拟

变量:
pageNum 记录可显示的最大行数(1~4),由 n 决定;
first 记录当前页面的第一个数字;
idx 记录当前的光标位置(1~pageNum);
curr 记录当前光标指向的数字。

在光标移动过程中,维护以上变量,具体情况有:

  1. 首行往上,变换首行:
    – 首行为1,翻页,到最尾;
    – 首行为其他,滚动
  2. 尾行往下,变换首行:
    – 尾行为n,翻页,到开头
    – 尾行为其他,滚动
  3. 中间行往上或往下,移动光标即可。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

#include<iostream>
#include<string>
using namespace std;
#define maxNum 4
int main(){
    
    
    int n;
    string str;
    while(cin >> n >> str){
    
    
        if(n == 1){
    
    
            cout << 1 << endl << 1;
            continue;
        }
        int pageNum = maxNum;
        if(n <= maxNum) pageNum = n;            // pageNum 记录显示的最大行数
        int first = 1, idx = 1, curr = 1;
        for(char ch: str){
    
    
            if(1 == idx && ch == 'U'){
    
              // 首行往上,需要变换首行
                if(1 == curr){
    
                      // 首行为1,翻页,到最尾
                    idx = pageNum;
                    first = n - pageNum + 1;
                    curr = n;
                }else{
    
                              // 首行为其他,滚动
                    --curr;
                    --first;
                }
            }else if(pageNum == idx && ch == 'D'){
    
        // 尾行往下,变换首行
                if(n == curr){
    
                            // 尾行为n,翻页,到开头
                    idx = 1;
                    first = 1;
                    curr = 1;
                }else{
    
                                    // 尾行为其他,滚动
                    ++curr;
                    ++first;
                }
            }else{
    
    
                if(ch == 'D'){
    
                            // 移动光标
                    ++idx;
                    ++curr;
                }else if(ch == 'U'){
    
    
                    --idx;
                    --curr;
                }
            }
        }
        for(int i = 0; i < pageNum; ++i){
    
    
            cout << first + i << " ";
        }
        cout << endl << curr << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_19887221/article/details/126638984
mp3
今日推荐