题解 | #MP3光标位置#
MP3光标位置
https://www.nowcoder.com/practice/eaf5b886bd6645dd9cfb5406f3753e15
三指针模拟屏幕的内容,其实很简单。
#三个指针#
#include<iostream> #include<string> #include <vector> using namespace std; void back(int &left,int &mid,int &right,int n) { if(left > 2*n-1) { left = left - n; right = right - n; mid = mid - n; } if(right < n) { left = left + n; right = right + n; mid = mid + n; } } int main(){ //接收数据 int n; cin >> n; string ss; cin >> ss; //开始写算法,打算使用三指针试一试 int left = n; int right = n+3; int mid = n; vector<int> data(3*n); for(int i = 0;i < 3;i++) { for(int j = 0;j < n;j++) { data[n*i+j] = j+1; } } //写一个函数,叫恢复,当right比n小或者left比2n-1大,就回到中间 //开始了哈 for(int i = 0;i < ss.size();i++) { if(ss[i] == 'U') { mid = mid - 1; if(data[mid] == n) { //这个时候是会发生大翻页的 right = mid; left = mid - 3; back(left,mid,right,n); }else{ if(mid < left) { //会发生小翻页 left = mid; right = left + 3; } } } if(ss[i] == 'D') { mid = mid + 1; if(data[mid] == 1 ) { //这个时候是会发生大翻页的 left = mid; right = left + 3; back(left,mid,right,n); }else{ if(mid > right) { //会发生小翻页 right = mid; left = right - 3; } } } } if(n<=4) { for(int jj = 0;jj < n;jj++) { cout << data[jj] << " "; } }else{ for(int i = left;i <= right;i++) { cout << data[i] << " "; } } cout << endl; cout << data[mid]; return 0; }
#三个指针#