题解 | #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;
}