题目

求数组中第二大的数

思路

第一遍求 max1;第二遍求 max2 满足 a[i]<max1 的最大,或 a[i]>max2 && a[i]<max1;全相等时要按题面约定。

解题分析

一遍扫描维护第一大、第二大(互异时)。遇到比 first 大的,second 取原 first 再更新 first。有重复最大值时第二大可能等于第一大,题目若要求严格第二大需另判。

完整程序

#include <stdio.h>

int main(void)
{
    int n, a[500];
    if (scanf("%d", &n) != 1 || n < 2 || n > 500) {
        return 1;
    }
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    int first = a[0], second = a[1];
    if (second > first) {
        int t = first;
        first = second;
        second = t;
    }
    for (int i = 2; i < n; i++) {
        if (a[i] > first) {
            second = first;
            first = a[i];
        } else if (a[i] > second) {
            second = a[i];
        }
    }
    printf("%d\n", second);
    return 0;
}

运行示例

输入:

5
3 9 1 7 5

输出:

7