这一点输入短小易于理解的模拟题,就喜欢这样的题。
方法很简单,a[0]为非0的时候循环交换,把a[0]位置上的数放到正确的位置,直到a[0]等于0,
这个时候可能没有完全排好序,所以要有一个函数需要不在正确位置上的数。
注意这个函数,不能每次都从1开始寻找,要从上次找到的位置开始寻找,要不然会超时。
代码如下:
#include <iostream>
using namespace std;
int a[100001]={0};
int N;
int findBegin(int begin) //begin 是上次函数执行找到的位置,这个很重要
{
for(int i = begin;i<N;i++)
if(a[i] != i)
{
return i;
}
return 0;
}
int main()
{
scanf("%d",&N);
int begin = 1;
int num = 0;
int i = 0;
for(i = 0;i<N;i++)
{
scanf("%d",&a[i]);
}
begin = findBegin(begin);
while(begin)
{
if(a[0] == 0)
{
num++;
int temp = a[begin];
a[begin] = a[0];
a[0] = temp;
}
while(a[0] != 0)
{
num++;
int j = a[0];
a[0] = a[j];
a[j] = j;
}
begin = findBegin(begin);
}
printf("%d\n",num);
return 0;
}