一、解题历程
*
看完题目,我的第一反应是用嵌套循环,i从0到n,让a[i]与每一个数进行比较,用more数组来存放比a[i]大的个数,用less数组来存放比a[i]小的个数,最后用遍历a[i],判断每个a[i]的less和more是否相等,是就输出该数,否则输出-1,并且跳出循环。考虑到可能会有多个相同的数,他们都是中间数,所以只要找到一个输出即可。
想到这里,觉得逻辑上没什么问题,就照着思路写出代码,提交后发现只有20分,检查后发现是由于在最后一步输出时,判断输出-1后没有break出循环,所以输出多次-1导致测试失败。
把这个bug改过来后,又提交一遍,发现只有80分,想了很久,突然发现n的取值为1或者2的时候情况很特殊,这时候会发生比a[i]大或者小的个数为0的情况,于是补上n=1时和n=2时的处理,
(1)n=1时,比它大或者小的个数都为0,所以直接输出这个数就ok了
(2)n=2时,一开始以为是2个不同的数,想当然的就直接输出-1
提交上去只有90分,我一想,是不是n=1时的处理出问题了,然后觉得没有比它大或者小的数,这个数怎么能叫中间数呢,于是就又把n=1的处理改成直接输出-1,一提交又变回80分,然后又重新看题意,发现原来对中间数的认识是对的,即使比它大或者小的个数都为0,这个数也叫中间数,因为题目中说了 “如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。”。
既然n=1的处理没问题,那问题只能是在n=2的处理上了,突然发现遗漏了两个数相等时的情况,此时本质上就跟n=1时一样,直接输出该数就ok了。
由于担心n>2时的处理有问题,又仔细地想了一下,发现n>2时,每个数的比它大或者比它小的数肯定不为0,所以不会出现前面的bug了,这时重新提交,终于100分了。
二、小结
*
通过这道题,我更加认识到自己的不足:在思考问题方面不够全面,经常是先想到一个点,就开始动手做,然后发现有问题了再去找原因,这样逻辑混乱,常常会出现遗漏。
针对以上不足,首先应该先全面严谨的罗列问题的所有可能性,再分别对不同情况进行处理(尤其是测试例中的边界值),这样才能更有条理性和逻辑性,而且在考场上,是无法当场测试的,如果出了bug,我却没有发现,这是很可怕的。其次是审题时要仔细,不要想当然的自以为是这样的,不要自己觉得,要仔细读题,深入理解每个概念的核心本质,不要自己加一些修饰,像这道题一样,就不应该画蛇添足,曲解中间数的定义而导致丢分。
三、满分代码
#include<iostream