top1编程
← 返回题目
题解

找出谁是第二高

1 条题解

  • 0
    @ 2026-8-5 1:08:04

    解题思路

    "找出第二高",最直接的办法就是找两遍:

    第一遍:从头到尾扫描,找出最高的同学,记住他的位置 maxp。就像赛跑先看看谁是第一名。

    第二遍:再从头到尾扫描,但跳过第一名(i == maxp 就不看),在剩下的人里再找出最高的——这个人就是全班第二高啦!

    打个比方:想找全班第二高,先找出最高的人让他出列,剩下的人里最高的自然就是第二高。

    注意:题目说身高没有重复,所以不用担心"最高和第二高一样高"的情况。

    还有个小坑:输出格式题目里写了"学号以及他的身高",样例输出也是 7 159(先学号后身高),所以输出顺序是 学号 身高,别搞反了哦。

    参考代码

    // P4474 找出谁是第二高:先找最高,再在其余人中找最高(即第二高),输出学号与身高
    #include <iostream>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        int a[1005];
        int maxp = 0;  // 最高同学的位置
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            if (a[i] > a[maxp]) maxp = i;  // 第一遍找最高的同学
        }
        int p = -1;  // 第二高同学的位置,先设成-1表示还没找到
        for (int i = 0; i < n; i++) {
            if (i == maxp) continue;            // 跳过最高的同学
            if (p == -1 || a[i] > a[p]) p = i;  // 剩下的人里找最高的
        }
        cout << (p + 1) << ' ' << a[p] << endl;  // 输出学号(下标+1)和身高
        return 0;
    }
    

    复杂度分析

    • 时间:找最高扫一遍 O(n),找第二高再扫一遍 O(n),总共 O(n),非常快。
    • 空间:用数组存了 n 个身高,是 O(n)。
    • 1