pat 1067
PAT 1067
2023-09-14 09:13:21 时间
1. 源代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100010;
int pos[maxn];//存放各数字当前所处的位置编号
int main(){
int n,ans = 0;
scanf("%d",&n);
int left = n-1,num;//left表示除0以外不在本位上的个数
for(int i = 0;i<n;i++){
scanf("%d",&num);
pos[num] = i;//数num所处的位置
if(num == i && num!=0) left--;
}
int k = 1;//k 搜索的起始下标
while(left > 0){
//如果0在本位上,则寻找一个当前不在本位上的数与0交换
if(pos[0] == 0){
while(k< n){
if(pos[k] != k){
swap(pos[0],pos[k]);
ans++;
break;
}
k++;//自增
}
}
while(pos[0]!=0){
swap(pos[0],pos[pos[0]]);
ans++;
left--;
}
}
printf("%d",ans);
return 0;
}
/**
注
1.不考虑0是否失序(从而统一每次while结束都是left--)
2.采用pos[num] = i;的做法,与直接array[i] = num;有很大不同
3.这里的k从1开始,表示第一个失序的下标。从而避免大数据带来的时间耗费!
4.采用swap()函数精简代码;或许有人对swap(pos[0],pos[pos[0]])不大理解。建议手动模拟。
*/
相关文章
- PAT 1033. To Fill or Not to Fill (贪心)
- PAT 1115 Counting Nodes in a BST[构建BST]
- PAT 1074 Reversing Linked List[链表][一般]
- PAT 1045 Favorite Color Stripe[dp][难]
- PAT 1018 Public Bike Management[难]
- PAT 1067 Sort with Swap[难]
- PAT 1030 Travel Plan[图论][难]
- PAT 1016 Phone Bills[转载]
- PAT 1065
- 算法笔记的学习心得和知识总结(四)|CodeUp and Pat篇(算法笔记第四章 哈希算法)
- 算法笔记的学习心得和知识总结(一)|CodeUp and Pat篇(算法笔记第二章)