PAT A1067 Sort with Swap(0, i) (25分)

前言

传送门

正文


参考题解

#include<iostream>
#include<algorithm>

using namespace std;
/* 对n个非负整数进行排序(从0~n-1),但只允许swap(0,*)操作;swap(0,y)表示将0和y的位置进行交换, 问你将这n个数进行升序排序,最少需要进行几次swap(0,*)操作 思路: 如果数字0在i号位,则找到数字i的当前位置,将然后把0和i进行交换; 如果数字0是在0号位,那么需要随便选择一个还没有回到本位的数字,将0与该数字进行交换 注意点: 1、每次只能与0进行交换,一旦某个数字回到本位后,则不对该数字进行后续操作 2、在随便选择一个还没回到本位的数字时,可以定义一个变量k,用来保存当前不在本位上的最小数(初始为1) 3、数组pos记录每个数字的位置 */
const int N=1e5+10; 
int pos[N],n,res=0;
int main(){
	scanf("%d",&n);
	int last=n-1,num;//last表示除0以外不在本位上的数的个数
	for(int i=0;i<n;i++){
		scanf("%d",&num);
		pos[num]=i;//数字num在i号位
		if(num!=0&&num==i) last--;//如果除零以外有在本位上的数 
	} 
	int k=1;//k表示当前不在本位上的最小数
	while(last>0){
		if(pos[0]==0){//如果0在本位 
			while(k<n){//找一个不在本位上的数进行交换 
				if(pos[k]!=k){
					swap(pos[0],pos[k]);
					res++;
					break;
				}
				k++;
			}
		}
		while(pos[0]!=0){//0不在本位 
			swap(pos[0],pos[pos[0]]);
			res++;
			last--; 
		}
	} 
	printf("%d\n",res);
	return 0;
}
全部评论

相关推荐

09-01 21:40
已编辑
同济大学 Java
点赞 评论 收藏
分享
09-29 00:03
门头沟学院 Java
点赞 评论 收藏
分享
10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务