2020京东校园招聘笔试编码题小分享--队列分组排序

本文分享了2020年京东校园招聘数据研发岗笔试中的一道编码题,题目要求将一队人按身高升序重新排列,探讨了如何最大化的进行分组并提供了解题思路和Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

被记住的永远是疯子!

简介

这道题是昨晚京东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]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值