题解 | #争夺前五名#
争夺前五名
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;
}