列表

详情


HJ64. MP3光标位置

描述

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

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

  1. 歌曲总数<=4的时候,不需要翻页,只是挪动光标位置。

光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。

其他情况下用户按Up键,光标挪到上一首歌曲;用户按Down键,光标挪到下一首歌曲。

2. 歌曲总数大于4的时候(以一共有10首歌为例):


特殊翻页:屏幕显示的是第一页(即显示第1 4首)时,光标在第一首歌曲上,用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌),同时光标放到最后一首歌上。同样的,屏幕显示最后一页时,光标在最后一首歌曲上,用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。

一般翻页:屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,用户按Up键后,屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。光标当前屏幕的最后一首歌时的Down键处理也类似。

其他情况,不用翻页,只是挪动光标就行。

数据范围:命令长度,歌曲数量
进阶:时间复杂度:,空间复杂度:

输入描述

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

输出描述

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

示例1

输入:

10
UUUU

输出:

7 8 9 10
7

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 256KB, 提交时间: 2020-07-07

#include<stdio.h>
typedef struct{
    int currDisp[4];
    int cursor;
    int total;
}MP3;
void Init(MP3* mp3, int n){
    mp3->cursor = 1;
    mp3->total = n;
    if (n < 4){
        for (int i = 0; i < n; i++){
            mp3->currDisp[i] = i + 1;
        }
        return;
    }
    for (int i = 0; i < 4; i++){
        mp3->currDisp[i] = i + 1;
    }
}
void up(MP3* mp3){
    if (mp3->total <= 4){
        if (mp3->cursor == 1){
            mp3->cursor = mp3->total;
        }
        else {
            mp3->cursor--;
        }
        return;
    }
    if (mp3->cursor == 1){
        mp3->cursor = mp3->total;
        for (int i = 0; i < 4; i++){
            mp3->currDisp[i] = mp3->total - 3 + i;
        }
    }
    else {
        if (mp3->cursor == mp3->currDisp[0]){
            for (int i = 0; i < 4; i++){
                mp3->currDisp[i]--;
            }
            mp3->cursor = mp3->currDisp[0];
        }
        else {
            mp3->cursor--;
        }
    }
}
void down(MP3* mp3){
    if (mp3->total <= 4){
        if (mp3->cursor == mp3->total){
            mp3->cursor = 1;
        }
        else {
            mp3->cursor++;
        }
        return;
    }
    if (mp3->cursor == mp3->total){
        mp3->cursor = 1;
        for (int i = 0; i < 4; i++){
            mp3->currDisp[i] = i + 1;
        }
    }
    else {
        if (mp3->cursor == mp3->currDisp[3]){
            for (int i = 0; i < 4; i++){
                mp3->currDisp[i]++;
            }
            mp3->cursor = mp3->currDisp[3];
        }
        else {
            mp3->cursor++;
        }
    }
}
int main(){
    MP3* mp3;
    int n;
    char order[100];
    while (scanf("%d", &n) != EOF){
        while (getchar() != '\n');
        gets(order);
        mp3 = (MP3*)malloc(sizeof(MP3));
        Init(mp3, n);
        for (int i = 0; order[i] != '\0'; i++){
            if (order[i] == 'U'){
                up(mp3);
            }
            else {
                down(mp3);
            }
        }
        if (mp3->total < 4){
            for (int i = 0; i < mp3->total; i++){
                printf("%d ", mp3->currDisp[i]);
            }
        }
        else {
            for (int i = 0; i < 4; i++){
                printf("%d ", mp3->currDisp[i]);
            }
        }
        printf("\n%d\n", mp3->cursor);
        free(mp3);
    }
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 312KB, 提交时间: 2021-01-01

#include<stdio.h>

#include<string.h>

int main(){

    int nSong;

    char order[1000];

    int tmp;

    while(~scanf("%d", &nSong)){

        scanf("%s", order);

        int nOrder = strlen(order);

        int val, pos;//val表示当前光标指向的数值,pos表示当前光标指向的行号

        if(nSong<=0) continue;

        else if(nSong<=4){

            val = 1;

            pos = 1;

            for(int i=0;i<nOrder;i++){

                if(order[i]=='U'){

                    val--;

                    pos--;

                    if(pos==0){

                        val=nSong;

                        pos=nSong;

                    }

                }

                else if(order[i]=='D'){

                    val++;

                    pos++;

                    if(pos==nSong+1){

                        val = 1;

                        pos = 1;

                    }

                }

            }

            for(int j=1;j<=nSong;j++){

                if(j==nSong) printf("%d\n", j);

                else printf("%d ", j);

            }

            printf("%d\n", val);

        }

        else if(nSong>4){

            val = 1;

            pos = 1;

            for(int i=0;i<nOrder;i++){

                if(order[i]=='U'){

                    if(pos==1 && val==1) { pos=4; val=nSong; }

                    else if(pos==1 && val!=1) val--;

                    else if(pos!=1 && val==1) { pos--; val=nSong; }

                    else if(pos!=1 && val!=1) { pos--; val--; }

                }

                else if(order[i]=='D'){

                    if(pos==4 && val==nSong) { pos=1; val=1; }

                    else if(pos==4 && val!=nSong) val++;

                    else if(pos!=4 && val==nSong) { pos++; val=1; }

                    else if(pos!=4 && val!=nSong) { pos++; val++; }

                }

            }

            for(int j=1;j<=4;j++){

                tmp = val + j - pos;

                if(tmp==0) tmp=nSong;

                else if(tmp>nSong) tmp-=nSong;

                if(j!=4) printf("%d ", tmp);

                else printf("%d\n", tmp);

            }

            printf("%d\n", val);

        }

    }

    return 0;

}

上一题