题目
思路
首先我们可以看到每次交换都是将0和0所在位置对应的元素交换,所以我们可以通过这个思路编码,当0到0位置了但是其他的数字还有的没有归位,则选取最小的一个没有归位的元素和0交换,直到所有元素都归位。
代码
#include <iostream>
using namespace std;
#define nmax 100005
#define inf 999999
int pos[nmax];
int main() {
int n;
cin >> n;
int cnt = 0;
//记录还没在本位上的数字
int remain = 0;
//第一轮找到0的位置
for (int i = 0; i < n; ++i) {
int tmp;
cin >> tmp;
pos[tmp] = i;
if (i != tmp && tmp != 0)
remain++;
}
int k = 1;
while (remain > 0) {
if (pos[0] == 0) {
for (; k < n; ++k) {
if (pos[k] != k) {
swap(pos[0], pos[k]);
cnt++;
break;
}
}
}
while(pos[0] != 0) {
swap(pos[0], pos[pos[0]]);
cnt++;
remain--;
}
}
cout << cnt;
return 0;
}