题解 | #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;
}
#三个指针#

查看8道真题和解析