题解 | #MP3光标位置#
MP3光标位置
https://www.nowcoder.com/practice/eaf5b886bd6645dd9cfb5406f3753e15?tpId=37&tags=&title=&difficulty=0&judgeStatus=0&rp=1&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D37%26type%3D37
/* 思路: 利用一个容量为4的数组来模拟菜单。 */ #include <array> #include <deque> #include <iostream> using namespace std; int main() { int n; string command; cin >> n >> command; int len = command.length(); int pos = 1; array<int,4> dq{0}; if(n <= 4 ){ for(int i = 0 ; i < len; ++i){ if(command[i] == 'U'){ if(--pos == 0){ pos = n; } }else{ if(++pos == n+1){ pos = 1; } } } for(int i = 0 ; i < n; ++i){ cout << i+1 << " "; } cout << endl; cout << pos << endl; } // 歌曲数量超过4首 else{ //采用滑动窗口 // 最开始的菜单界面 放的 1,2,3,4 for(int i = 0 ; i < 4; ++i){ dq[i] = i + 1; } // 遍历命令列表 for(int i = 0 ; i < len; ++i){ // 按下up键 if(command[i] == 'U'){ // 当光标在第一首歌曲上,用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌) if(--pos == 0){ pos = n; //采用滑动窗口 for(int j = 0 ; j < 4; ++j){ dq[j] = n - 4 + j + 1; } }else{ // 一般翻页:屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时, // 用户按Up键后,屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。 if(pos == dq[0]-1){ for(int j = 0 ; j < 4; ++j){ dq[j] -= 1; } } } }else{// 用户按下 down 键的情况 // 屏幕显示最后一页时,光标在最后一首歌曲上,用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。 if(++pos == n+1){ pos = 1; //采用滑动窗口 for(int j = 0 ; j < 4; ++j){ dq[j] = j + 1;; } }else{ // 光标当前屏幕的最后一首歌时的Down键处理 if(pos == dq[3]+1){ for(int j = 0 ; j < 4; ++j){ dq[j] += 1;; } } } } } for(auto p : dq){ cout << p << " "; } cout << endl; cout << pos << endl; } } // 64 位输出请用 printf("%lld")