版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
写在前面
- 思路分析
- 正确理解题意
- 伪代码实现
while(left>0) { if(0在本号位) { 找到1个不在本位上的数,令其与0交换; 交换次数加1; } while(0不在本号位) { 将0所在位置的数与0交换; 交换次数++; left--; } }
- 新知识点,学习ing
测试用例
-
input: 10 3 5 7 2 6 4 9 0 8 1 output: 9 input: 5 1 2 3 4 0 output: 4
ac代码
-
#include <iostream> #include <algorithm> using namespace std; const int maxn = 100010; int pos[maxn]; // 存放各数字当前所处位置编号 int main() { int n, ans = 0; // ans表示总交换次数 scanf("%d", &n); // left 存放除0以外不在本位上的数的个数 int left = n-1, num; for(int i=0; i<n; i++) { scanf("%d", &num); // num所处的位置为i pos[num] = i; // 除0以外有在本位上的数 if(num == i && num != 0) { left--; } } // k存放除0以外当前不在本位上的最小数 int k = 1; // 只要还有数不在本位上 while(left > 0) { // 0在本位上,寻找一个当前不在本位上的数与0交换 if(pos[0] == 0) { while(k<n) { // 找到1个当前不在本位上的数k if(pos[k] != k) { // 将k与0交换位置 swap(pos[0], pos[k]); // 交换次数加1 ans++; break; } // 判断k+1是否在本位 k++; } } // 0不在本位,将0所在位置的数的当前所处位置与0的位置交换 while(pos[0] != 0) { // 将0与pos[0]交换 swap(pos[0], pos[pos[0]]); ans++; // 交换次数加1 left--; // 不在本位上的数的个数减1 } } printf("%d\n", ans); return 0; }
学习代码
-
#include <iostream> using namespace std; int main() { int n, t, cnt = 0, a[100010]; cin >> n; for(int i=0; i<n; i++) { scanf("%d", &t); a[t] = i; } for(int i=1; i<n; i++) { if(i!=a[i]) { while(a[0] != 0) { swap(a[0], a[a[0]]); cnt++; } if(1 != a[i]) { swap(a[0], a[i]); cnt++; } } } cout << cnt; return 0; }