被记住的永远是疯子!
简介
这道题是昨晚京东2020校园招聘数据研发岗的笔试题编码题原题,昨日时间有限,我又能力有限,所以木有写全,今天上午自己整理了一下,分享给需要的人吧。(有错还麻烦大家提示我,谢谢啦。)
题目
只能靠印象复述了:
有一队人(N个),按从左到右的顺序排成一队,每个人有自己的身高H,原始队列并未按照身高升序排列。现将队伍按照从左到右的顺序分成多个组,每组人数不一定相等,对每组人按身高排序,再按照拆分组的顺序排成一队,使得最后生成的队列是按照身高升序排列的(队列中间的身高可以相等)。求能够实现此需求的最大分组数。
输入:
第一行:N(人数)
第二行:Heights(身高,以空格隔开)
输出:
第一行:n(最大分组数)
例:
输入: 4
2 1 3 2
输出: 2
解题思路
我个人一开始对这道题的思路是很模糊的,递归?还是什么?想了许久,不如列一下需求。
分组:
分成几组?–N个人,最多分N组,所以可能分的组数为1-N。
怎么分?–N个人分1-N组的方法有很多种,举例子:4个人分三组包括3种情况,按照队列分可以列为(1,2,1)、(2,1,1)、(1,1,2),每个数字代表组内的人数。按照这个思想,我们可以根据每组的人数来拆分小组。所以就需要统计人数。
排序:
排序方法:内置高阶函数sorted
分析需求:求最大组数,N个人分1-N组,可以倒序来,N-1组,只要满足条件直接return返回最终结果。
代码
编译环境:python3.7 注:此代码并未考虑运算时间
编写代码:
import itertools
from copy import copy
if __name__ == "__main__":
# 输入的内容s:
s= '5\n2 1 3 2 5'
# 获取人数N
N = int(s.split('\n')[0])
# 获取身高列表并将其以int格式存储至列表
h_list = s.split('\n')[1].split(' ')
H_list = [] # 身高列表
for item in h_list:
H_list.append(int(item))
# 获取每组人数的函数
def get_group_numbers(n):
# 每组可能的人数为1-N人
a = range(1,N+1)
# 处理一个str,用于给itertools.product函数传参
str = 'a,'*n
# 初始化一个结果列表
list_ = []
# [1,2,3,4],[1,2,3,4],[1,2,3,4]... 笛卡尔积
for x in itertools.product(*eval(str)):
# 先将所有可能的结果存入列表
list_.append(list(x))
# 删除列表中相加大于人数的分组人数情况,注意逆序删除
for item in list_[::-1]:
sum = 0
for num in item:
sum+= num
if sum != N:
list_.remove(item)
# 返回可能的分组人数列表
return list_
# 对每组排序
def sort_by_group(n_groups,list_target):
lists = get_group_numbers(n_groups)
sorted_new_queue = []
for item in lists:
copy_list = copy(list_target)
new_queue = []
# 获取各个分组身高,插入新的队列
for num in item:
group = []
# 根据每组的人数将身高从头部弹出并插入到小组中
for i in range(num):
group.append(copy_list.pop(0))
new_queue.append(group)
sorted_queue = []
# 对队列排序
for each_group in new_queue:
sort_group = sorted(each_group)
sorted_queue.append(sort_group)
sorted_new_queue.append(sorted_queue)
# 返回在分成n_groups组情况下的所有按身高排序后的队列
return sorted_new_queue
# 主函数
def main():
# 逆序按分组数循环
for group_n in range(1,N+1)[::-1]:
new_queues = sort_by_group(group_n,H_list)
for new_queue in new_queues:
list = []
for group in new_queue:
for item in group:
list.append(item)
# 排序成功,直接返回
if list == sorted(list):
return '分组个数{},分组排序后情况{}'.format(group_n,new_queue)
print(main())
输出:
>>> 分组个数3,分组排序后情况[[1, 2], [2, 3], [5]]
本文分享了2020年京东校园招聘数据研发岗笔试中的一道编码题,题目要求将一队人按身高升序重新排列,探讨了如何最大化的进行分组并提供了解题思路和Python代码实现。
8046

被折叠的 条评论
为什么被折叠?



