📜  门| GATE CS 2021 |设置 1 |第 57 题(1)

📅  最后修改于: 2023-12-03 15:12:37.624000             🧑  作者: Mango

门 | GATE CS 2021 |设置 1 |第 57 题

这是一道来自于门(GATE)计算机科学考试2021年设置1中的第57道题目,以下为题目的简述:

题目简述

一个数组 A[1..n] 中的所有元素都是 1 或 2。下面这个函数的作用是将所有的 1 元素依次交换到数组的前面,所有的 2 元素依次交换到数组的后面。

void fxn(int A[], int n) {
    int i = 0, j = n-1;
    while (i <= j) {
        if (A[i] == 2 && A[j] == 1) {
            A[i] = 1;
            A[j] = 2;
            i++;
            j--;
        }
        else if (A[i] == 1) {
            i++;
        }
        else {
            j--;
        }
    }
}

现在假设有一个数组 A[1..n],其中有 k 个 1 元素,k >= 1。设交换这 k 个 1 使得在 A 数组中所有的 1 元素依次排在前面的最小交换次数为 p。请输出 p 的值。

解题思路

根据上述题意,我们可以先从数组的左边开始找到第一个不是1的数字的位置i,再从数组的右边开始找到第一个是1的数字的位置j,然后交换数组A[i] 和 A[j]的值,直到i>=j 为止。最终输出交换次数p。

由于这个函数需要遍历整个数组A,所以时间复杂度为O(n)。

代码实现

以下是对应的C++代码段:

#include<bits/stdc++.h>

using namespace std;

int min_swaps(int arr[], int n) {
    int i = 0, j = n - 1, swaps = 0;
    while (i < j) {
        while (arr[i] == 1 && i < j) {
            i++;
        }
        while (arr[j] != 1 && j > i) {
            j--;
        }
        if (i < j) {
            swap(arr[i], arr[j]);
            swaps++;
            i++;
            j--;
        }
    }
    return swaps;
}

int main() {
    int n = 8;
    int arr[] = {2, 1, 2, 1, 1, 2, 2, 1};
    int min_swaps_num = min_swaps(arr, n);
    cout << "The minimum number of swaps needed is: " << min_swaps_num << endl;
    return 0;
}
可视化演示

为了直观地演示以上代码的运行过程,我们在此处提供了一个在线的可视化演示工具,读者可以使用该工具来观察交换过程和步骤,提高理解和代码的熟练度。

参考文献