題目与华为的面试题类似,只能与0元素交换。
考虑情况:
1、0交换到了位置0,但仍有元素未被交换,需要多换2次。
2、初始位置为0,比不初始为0的多交换两次
3、计算环数与不在位个数。
代码:
#include "iostream"
#include "vector"
#include "string"
#include "cstring"
using namespace std;
int main()
{
int N, group = 0, swap = 0;
cin >> N;
int num[100000];
bool visit[100000];
for (int i = 0; i < N; i++)
cin >> num[i];
memset(visit, false, sizeof(visit));
for (int i = 0; i < N; i++)
{
if (visit[i] || num[i] == i)
continue;
group++;
int j = i;
while (visit[j] == false)
{
swap++;
visit[j] = true;
j = num[j];
}
}
if (num[0])cout << swap + group - 2;
else cout << swap + group;
return 0;
}