记录一个腾讯的笔试题,做题不能硬做,要学会取巧思考。
题目
首先输入n (n 保证是“偶数”),然后给你n 个数字 如果删除一个元素,求其余的n -1 个数的中位数 样例: 输入:4 2 3 1 4 输出:3 2 3 2 // 解释: 删掉2 ,那么剩下1 ,3 ,4 中位数是3 ,3 ,1 ,4 和 1 ,3 ,4 是一样的,求中位数,实际上就和位置没有什么关系了。 删掉3 ,那么剩下1 ,2 ,4 中位数是2 删掉1 ,那么剩下2 ,3 ,4 中位数是3 删掉4 ,那么剩下1 ,2 ,3 中位数是2
我的解法
逐个删除,然后计算中位数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import sysclass Solution (): def notify (self, nums ): tmp = nums nums.sort() for for i in range (len (nums)): num = nums[i] nums.pop(i) print(int (self.get_median(nums))) nums.append(num) def get_median (self, nums, sum ): nums.sort() half = len (nums) // 2 return (nums[half] + nums[~half]) / 2 if __name__ == "__main__" : res = [] s = sys.stdin.readline().strip("\n" ) while s != "" : res.append(s) s = sys.stdin.readline().strip("\n" ) N = int (res[0 ].split(" " )[0 ]) nums = [int (x) for x in res[1 ].split(" " )] solution = Solution() ans = solution.notify(nums)
朱老师的优秀解法
输入的是偶数个数字,所以: 1. 先排序,计算出左右中位数。 2. 再遍历原数组,将每个数字其与 Rmind
(右中位数) 比较 - 如果大于等于 Rmind
,去掉这个数字之后,剩下的数组只能得到较小的 Lmid
,输出 Lmid
。 - 如果小于 Rmind
,去掉这个数字之后,剩下的数组可以得到较大的 Rmid
,输出 Rmid
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 import sysclass Solution (): def getMedian (self, nums ): n = len (nums) origin = nums[:] nums.sort() Lmind = nums[n//2 - 1 ] Rmind = nums[n//2 ] for i in range (n): if origin[i] >= Rmind: print(Lmind) else : print(Rmind)if __name__ == "__main__" : res = [] s = sys.stdin.readline().strip("\n" ) while s != "" : res.append(s) s = sys.stdin.readline().strip("\n" ) N = int (res[0 ].split(" " )[0 ]) nums = [int (x) for x in res[1 ].split(" " )] solution = Solution() ans = solution.getMedian(nums)
其余题目的Java解法
https://zihao.blog.csdn.net/article/details/108437612
复盘
这道题,很简单,应该全部AC的,最终只AC了50%。 也应该首先做这道题,以后笔试,首先留够每道题2-3分钟的读题时间,易懂易做的题目,优先完成。 做题要注意观察,把握规律,不要硬怼,要学会取巧。