女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

三张分数卡是 4、9、6。机器人拿第一张当“暂时冠军”,再接受挑战。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 起步冠军是 4
  2. 看到 99 更大,换冠军
  3. 看到 66 不大,保留 9

找最大值时,记录“目前见过的最大值”,每看一个新值就比较并按需更新。

找最小值则把比较方向反过来。一次遍历后,所有值都已挑战过。

01怎样从一堆数里找最大值?

假设数组是:

int a[5] = {7, 2, 9, 4, 6};

最自然的方法是:先把第一个数当作“目前最大”,然后依次比较后面的数。

02第一步:先相信第一个元素

int maximum = a[0];

现在暂时认为最大值是 7。

03第二步:逐个比较并更新

for (int i = 1; i < 5; i++) {
    if (a[i] > maximum) {
        maximum = a[i];
    }
}
开始

max=7

比较 2

不变

比较 9

max=9

比较 4、6

不变

04最小值怎么求?

只要把比较方向反过来:

int minimum = a[0];

for (int i = 1; i < 5; i++) {
    if (a[i] < minimum) {
        minimum = a[i];
    }
}

05为什么不能把最大值初始成 0?

int a[3] = {-8, -2, -5};

如果写:

int maximum = 0;

最终会错误地得到 0,但 0 根本不在数组里。

06空数组怎么办?

普通 C++ 数组声明时通常要有正的元素个数;但以后使用 vector 等容器时,确实可能遇到空序列。

如果没有任何元素,“最大值”就没有自然答案,因此程序必须先处理空数据情况。

你已经知道了什么

  • 求最大值可以先把第一个元素作为当前最大值。
  • 然后逐个比较,遇到更大的就更新。
  • 求最小值只需反转比较方向。
  • 不能随便把初值设成 0。
  • 对可能为空的数据,必须先处理“没有元素”的情况。

下一篇:怎样求数组的和与平均数?

轮到你来试一试

卡片是 -8、-3、-6,最大值能初始化为 0 吗?

想好了吗?点开看解释

这样会错误地留下 0,而 0 根本不在卡片里。用首项 -8 初始化,最后正确得到 -3。