题解 | #MP3光标位置#

MP3光标位置

http://www.nowcoder.com/practice/eaf5b886bd6645dd9cfb5406f3753e15

#include<bits/stdc++.h>
using namespace std;
int main() {
    int num;    //num代表歌曲总数
    string directory;    //字符串directory代表输入的一组命令
    while(cin>>num>>directory) {    //输入歌曲总数num和一组命令directory
        vector<int> song_list;    //存放屏幕上显示的4首歌曲
        for(int i=1;i<=num;i++)    //初始化为第一页的四首歌曲,即①~④
            song_list.push_back(i);
        int loc = 0;    //loc代表当前光标指向的歌曲位置,初始化为第一首歌曲,下标为0
        int len = directory.length();//len为输入的命令的个数
        if(num<=4) {    //当歌曲总数不超过4时
            for(int i=0;i<num;i++)    //不需要翻页,所以直接输出所有歌曲
                cout<<song_list[i]<<" ";
            cout<<endl;    //换行
            for(int i=0;i<len;i++) {    //按顺序执行每条命令
                if(directory[i] == 'U')    //当按下UP键,光标指向上一首歌曲,如果当前为第一首歌曲,则将指向倒数第一首歌曲
                    loc = (loc-1+num)%num;
                else if(directory[i] == 'D')    //当按下Down键,光标指向下一首歌曲,如果当前为最后一首歌曲,则将指向第一首歌曲
                    loc = (loc+1)%num;
            }
            cout<<song_list[loc]<<endl;    //最后输出光标指向的歌曲
        }
        else if(num>4) {    //当歌曲总数超过4首时
            vector<int> window{0,1,2,3};    //容器window初始化为第一页显示的4首歌曲
            for(int i=0;i<len;i++) {    //按顺序执行每条命令
                if(loc==0&&directory[i] == 'U') {    //如果当前光标指向的是第一首歌曲,且命令为U,那么光标和歌曲页都要变化
                    loc = (loc-1+num)%num;    //光标指向上一首歌曲
                    for(int j =0;j<window.size();j++)    //当前歌曲页的4首歌曲变为最后4首歌曲
                        window[j] = (window[j]-4+num)%num;
                }
                else if(loc==num-1 && directory[i] == 'D') {    //如果当前光标指向的是最后一首歌曲,且命令为D,那么光标和歌曲页都要变化
                    loc = (loc+1)%num;    //光标指向下一首歌曲
                    for(int j =0;j<window.size();j++)    //当前歌曲页的4首歌曲变为开头的4首歌曲
                        window[j] = (window[j]+4)%num;
                }
                else{    //如果不是以上两种情况,那么久属于一般的类型
                    if(directory[i] == 'U') {    //如果当前的指令为U
                        if(loc == window[0]) {    //如果光标指向当前歌曲页的第一首,那么光标和歌曲页都要变化
                            loc = (loc-1+num)%num;    //光标指向前一首歌曲
                            for(int j =0;j<window.size();j++)    //当前歌曲页的四首歌曲,全部向前移动1首
                                window[j] = (window[j]-1+num)%num;
                        }
                        else{
                            loc = (loc-1+num)%num;    //如果光标指向的不是当前歌曲页的第一首,只有光标需要变化
                        }
                    }
                    else if(directory[i] == 'D') {    //如果当前的指令为D
                        if(loc == window[3]) {    //如果光标指向当前歌曲页的第一首,那么光标和歌曲页都要变化
                            loc = (loc+1)%num;    //光标指向下一首歌曲
                            for(int j =0;j<window.size();j++)    //当前歌曲页的四首歌曲,全部向后移动1首
                                window[j] = (window[j]+1)%num;
                        }
                        else{
                            loc = (loc+1)%num;    //如果光标指向的不是当前歌曲页的最后一首,只有光标需要变化
                        }
                    }
                }
            }
            for(int i=0;i<window.size();i++) {    //输出当前歌曲页的所有歌曲
                cout<<song_list[window[i]]<<" ";
            }
            cout<<endl;
            cout<<song_list[loc]<<endl;    //输出当前光标指向的歌曲
        }
    }
    return 0;
}
全部评论

相关推荐

废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
3 1 评论
分享
牛客网
牛客企业服务