题解 | #争夺前五名#

争夺前五名

https://www.nowcoder.com/practice/cd052308a1c44a88ad00255f312c3e14

#include <stdio.h>
int main() {
    int n;
    int getFive[5] = {0}; // 初始化数组,元素全为0,后续插入顺序表需要使用
    // 输入n个同学
    scanf("%d", &n);
    // n个同学对应n个分数
    // 输入完成后,scanf()函数会从缓冲区读取数字
    while (scanf("%d", &n) != EOF) {
        getchar(); // 吸收空字符(空格,换行..)
        // 从缓冲区获取每个n,与数组中的5个元素进行比较
        for (int i = 0; i < 5; i++) {
            // 如果n大于数组中的第i个元素
            // 则从数组尾部最后一个元素开始,将所有元素往后移动!!!
            // 如果从下标i个元素开始移动,会将下标i+1个元素及往其以后的元素覆盖!!!这块地方卡了我好一会QAQ
            // 没学数据结构就开始刷题真的被狠狠拷打(⊙︿⊙)
            if (n > getFive[i]) {
                // 如存在n > getFive[i],则从元素最后一个元素开始(此处即下标4,元素长度为5)往后移动
                // j为下标4,为数组getFive的最后一个元素
                // 该元素开始逐个将数组元素往后移动一直到下标i个元素,因为要将下标i这个位置空出来,把n放进去!!
                for (int j = 4; j >= i; j--) {
                    getFive[j + 1] = getFive[j]; // 插入顺序表
                }
                // 将n放入数组getFive下标i的位置
                getFive[i] = n;
                // break语句结束,因为此时n比下标i + 1及其以后的元素都要大
                // 如不break语句结束,则会再后续循环中将后面元素都变为n!!!
                break;
            }
        }
    }

    // 从后面往前一个一个移动元素(如果从前往后移,会将元素覆盖!)
    for (int i = 0; i < 5; i++) {
        printf("%d ", getFive[i]);
    }
    return 0;
}
全部评论

相关推荐

11-07 13:31
怀化学院 Java
勇敢牛牛不怕难:又疯一个
点赞 评论 收藏
分享
喜欢吃蛋糕仰泳鲈鱼是我的神:字节可以找个hr 给你挂了,再放池子捞
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务