AcWing 5051. 翻转(c++详细注释版)
原题链接
中等
作者:
luckdog
,
2023-07-16 15:39:48
,
所有人可见
,
阅读 219
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
int n,a[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int l=1,r=n; //下标从1开始,到n
while(l<=n&&a[l]==l) l++; //当该数与下标相同时,往右走,从而找左边第一个不匹配的
while(r!=0&&a[r]==r) r--; //r不能走到0,同样当该数与下标下标相同时,从而找右边第一个不匹配的
if(l>n) cout<<"0 0";//当左边走完后,发现数都与下表对应,即找不到合理区间
else
{
for(int i=l,j=r;i<j;i++,j--){
swap(a[i],a[j]);//左右都找到第一个与下标不匹配的,交换两数
}
for(int i=1;i<=n;i++){
if(a[i]!=i){ //若交换了还是从头到尾不匹配,即找不到合理区间
cout<<"0 0";
return 0;
}
}
cout<<l<<" "<<r; //若所有数都与下标匹配,for循环结束,输出原来左右第一次不匹配的下标位置
}
return 0;
}
🐂