游戏排名第三大的分数| 豆包MarsCode AI 刷题

2 阅读3分钟

1. 解题思路

  • 首先,我们需要对给定的分数数组进行处理,统计不同分数的个数,并找出相应的目标分数。

  • 为了方便统计不同分数以及找到对应的排名分数,我们可以先对分数数组进行排序。排序后,相同的分数会相邻排列,方便我们进行后续的去重统计和目标分数查找操作。

  • 接着,根据不同分数的数量情况来确定目标分数:

    • 如果去重后的不同分数数量大于等于 3,那么我们直接返回排序后从后往前数第 3 个位置的分数(即第三大的分数)。
    • 如果去重后的不同分数数量小于 3,那么我们返回排序后的最后一个分数(即最大的分数)。

2. C++ 代码实现

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int findTargetScore(vector<int>& scores) {
    // 对分数数组进行排序
    sort(scores.begin(), scores.end());
    // 用于去重并统计不同分数的数量
    int distinctCount = 0;
    for (size_t i = 0; i < scores.size(); ++i) {
        // 如果是第一个元素,或者当前元素和前一个元素不相等,说明是不同的分数
        if (i == 0 || scores[i]!= scores[i - 1]) {
            distinctCount++;
        }
    }

    // 根据不同分数数量来确定目标分数
    if (distinctCount >= 3) {
        return scores[scores.size() - 3];
    } else {
        return scores[scores.size() - 1];
    }
}

你可以使用以下方式调用这个函数:

int main() {
    vector<int> scores = {80, 90, 80, 70, 100};
    int targetScore = findTargetScore(scores);
    cout << "目标分数是: " << targetScore << endl;
    return 0;
}

3. 代码片段解释

  • sort(scores.begin(), scores.end());

    • 这行代码使用了 C++ 标准库中的 sort 函数,它位于 <algorithm> 头文件中。sort 函数的作用是对给定区间内的元素进行快速排序,在这里就是对 scores 向量(可以理解为动态大小的数组)中的所有分数进行从小到大的排序。这样做方便后续统计不同分数以及查找目标分数。
  • if (i == 0 || scores[i]!= scores[i - 1]) { distinctCount++; }

    • 这个 if 语句用于统计不同分数的数量。当遍历分数数组时,如果当前是第一个元素(i == 0),那它肯定是一个不同的分数,直接计数加一;如果当前元素和前一个元素不相等(scores[i]!= scores[i - 1]),说明遇到了一个新的不同的分数,此时也将计数加一。通过这样的方式,循环结束后就能得到不同分数的准确数量 distinctCount
  • if (distinctCount >= 3) { return scores[scores.size() - 3]; } else { return scores[scores.size() - 1]; }

    • 这里根据之前统计得到的不同分数数量 distinctCount 来决定返回的目标分数。如果 distinctCount 大于等于 3,说明有足够多的不同分数,我们要返回第三大的分数,由于数组已经排好序了,第三大的分数在从后往前数第 3 个位置(索引为 scores.size() - 3);如果 distinctCount 小于 3,按照规则返回最大的分数,也就是数组中最后一个元素(索引为 scores.size() - 1)。

4. 个人心得

  • 在解决这个问题的过程中,排序是一个很关键的步骤,它能够将无序的数据变得有序,从而让后续查找和统计相关信息变得更加简单直观。像这里通过排序后去重统计不同分数数量就容易很多,不然要在无序的数据中准确统计不同分数会复杂得多,可能需要借助一些额外的数据结构比如 set 等,但效率可能就不如先排序后遍历判断了。
  • 另外,对于边界条件和规则的清晰理解也很重要,比如本题中根据不同分数数量来确定目标分数的规则要准确把握,代码实现时才能正确地通过 if-else 语句返回相应的结果,稍有不慎就可能出现逻辑错误导致结果不对。同时在写代码过程中,合理添加注释来解释代码的意图,方便自己后续回顾以及他人阅读理解代码也是很有必要的一个好习惯。