📜  门| GATE CS 2021 |设置 1 |问题 13(1)

📅  最后修改于: 2023-12-03 14:58:21.708000             🧑  作者: Mango

门| GATE CS 2021 |设置 1 |问题 13

该问题是2021年门计算机科学工程学科的设置1中的第13题。该题要求编写一个函数,以递归方式计算一个数字数组的最大值和次大值。

问题描述

给定一个数字数组,编写一个函数 find_largest_and_second_largest(),该函数以递归方式计算最大值和次大值,并将它们存储在结果数组中。结果数组的第一个元素应该是最大值,第二个元素应该是次大值。

函数原型:

void find_largest_and_second_largest(int arr[], int size, int results[]);

输入:

  • arr:整数数组,表示要计算的数字
  • size:数组的大小
  • results:整数数组,大小为2。结果数组中的第一个元素应该是最大值,第二个元素应该是次大值。

输出:

  • results:数组中的第一个元素是最大值,第二个元素是次大值
输入格式

输入包含多个测试用例。每个测试用例的第一行包含一个整数 n,表示数字数组的大小。接下来的 n 行包含数字数组的元素。

输入以一个整数 0 结束。

输出格式

对于每个测试用例,输出占一行,包含两个整数,用空格隔开。第一个整数是结果数组中的最大值,第二个整数是结果数组中的次大值。

示例

输入:

3
1
2
3
4
0

输出:

3 2
题解思路

本题可以使用递归方法求解。对于一个数字数组,我们可以将其分成两个部分,每个部分再递归调用 find_largest_and_second_largest() 函数,最后比较两个部分的结果,得出最大值和次大值。

在递归函数中,如果数组大小为1,则返回输入数组的第一个元素作为最大值和次大值;如果数组大小为2,则比较两个数字的大小,返回结果数组;否则,将数组分成两部分递归调用本函数,最后比较两个部分的结果,得出最大值和次大值。

代码实现
void find_largest_and_second_largest(int arr[], int size, int results[]) {
    if (size == 1) {
        results[0] = arr[0];
        results[1] = arr[0];
    } else if (size == 2) {
        if (arr[0] > arr[1]) {
            results[0] = arr[0];
            results[1] = arr[1];
        } else {
            results[0] = arr[1];
            results[1] = arr[0];
        }
    } else {
        int m = size / 2;
        int left[2], right[2];
        find_largest_and_second_largest(arr, m, left);
        find_largest_and_second_largest(arr + m, size - m, right);
        if (left[0] > right[0]) {
            results[0] = left[0];
            if (left[1] > right[0]) {
                results[1] = left[1];
            } else {
                results[1] = right[0];
            }
        } else {
            results[0] = right[0];
            if (right[1] > left[0]) {
                results[1] = right[1];
            } else {
                results[1] = left[0];
            }
        }
    }
}

在主函数中,可以按以下方式调用上述函数:

int main() {
    int arr[100], n, results[2];
    while (1) {
        scanf("%d", &n);
        if (n == 0) {
            break;
        }
        for (int i = 0; i < n; i++) {
            scanf("%d", &arr[i]);
        }
        find_largest_and_second_largest(arr, n, results);
        printf("%d %d\n", results[0], results[1]);
    }
    return 0;
}

本题解完整代码可以参考 GitHub