腾讯笔试题:求中位数

记录一个腾讯的笔试题,做题不能硬做,要学会取巧思考。

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
首先输入nn保证是“偶数”),然后给你n个数字
如果删除一个元素,求其余的n-1个数的中位数
样例:
输入:
4
2 3 1 4
输出:
3
2
3
2
// 解释:
删掉2,那么剩下1,3,4中位数是33,1,41,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 sys

class 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 sys

class 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分钟的读题时间,易懂易做的题目,优先完成。 做题要注意观察,把握规律,不要硬怼,要学会取巧。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!