解题思路:
首先回顾一下题目的输入格式与输出格式要求
输入:输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。
输出:对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。
首先要确定代码的输入是一个整数n,再接着n个不相同的整数;另外这里题目并没有对测试用例的数量进行说明,所以要清楚这里要用while循环(或者do while循环);接着就是数据的处理部分,就是单纯的从大到小排序,但是要注意是对每个整数的绝对值进行比较;最后的输出,就是排好序的n个整数。
注意事项:
1.一般在输入阶段,如果题目没有给出具体的测试数量,或者通过计算无法得出具体的处理次数,在代码中,对应则是while循环,而针对OJ的黑盒测试,测试的样本并不是无限数量的,所以应该考虑接收的输入可能到达文件末尾的情况,否则会导致输出超限。
2.在排序时,不应该只考虑整个循环结束后是否能够排好序,而也应该考虑有可能在循环结束之前就已经排好序了,所以应该加入一个标识位,来监测数组的排序状态,当排序一结束,就立马跳出循环,这样处理,对于大数据量的排序,可以达到明显的降低算法时间复杂度的效果。
3.对于题目的输出,可以有两种理解,第一种是对于一个测试用例就输出一次排序结果;第二种是对于所有的测试用例,最后一起输出排序的结果。个人认为第一种处理会使代码更加简单,同时这样处理也更加直观。
参考代码:
#include#includeint main() { int n, i, j, flag, temp; while(scanf("%d", &n) != EOF && n != 0) { int x[n]; for(i = 0; i < n; i++) { scanf("%d", &x[i]); } for(i = 1; i < n; i++) { flag = 1; for(j = 0; j < n - i; j++) { if(abs(x[j]) < abs(x[j+1])) { temp = x[j]; x[j] = x[j + 1]; x[j + 1] = temp; flag = 0; } } if(flag) { break; } } for(i = 0; i < n - 1; i++) { printf("%d ", x[i]); } printf("%d\n", x[i]); } return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复