如何实现层级化数字数组的排序?校园项目技术求助
解决方案:构建带层级的相似数字数组
嘿,我来帮你搞定这个校园项目里的数组构建问题!先把你的需求再梳理清楚,确保我没理解偏差:
- 长度超过4位的数字(比如144010)需要归到最长的已存在的短前缀下(优先找4位前缀1440,不存在则找3位144,再不存在找2位14,以此类推);
- 当数字最终归到14下时,必须排在所有以142开头的数字(包括142本身和它的子项)之后。
实现思路
核心是两步:前缀匹配找父项 + 按规则排序输出:
- 将所有数字转为字符串,方便快速匹配前缀;
- 对每个长数字,从最长的4位前缀开始检查,找到第一个存在于原始列表中的前缀作为父项;
- 构建父项到子项的映射,对子项按数字顺序排序;
- 分阶段生成最终数组,确保特殊情况(归到14下的子项)的排序符合要求。
代码示例(Python)
# 你的原始数字列表 num_list = [1, 14, 141, 141010, 141020, 141030, 141040, 141050, 141060, 142, 142010, 142020, 144, 1440, 144010, 144020, 144030, 144040] # 转为字符串集合(快速判断前缀是否存在)和字符串列表 num_str_set = set(str(num) for num in num_list) num_str_list = [str(num) for num in num_list] # 初始化父项到子项的映射 parent_map = {} for s in num_str_list: if len(s) <= 4: parent_map[s] = [] # 为每个长数字匹配父项 for s in num_str_list: if len(s) > 4: # 从最长前缀(4位)到最短(1位)依次查找 for prefix_len in [4, 3, 2, 1]: prefix = s[:prefix_len] if prefix in num_str_set: parent_map[prefix].append(s) break # 对子项按数字顺序排序 for parent in parent_map: parent_map[parent].sort() # 生成最终数组,处理特殊排序规则 final_result = [] # 第一部分:1 及其子项 final_result.append("1") final_result.extend(parent_map["1"]) # 第二部分:141 及其子项 final_result.append("141") final_result.extend(parent_map["141"]) # 第三部分:142 及其子项 final_result.append("142") final_result.extend(parent_map["142"]) # 特殊情况:如果1440和144都不存在,把14的子项放在142之后 if "1440" not in num_str_set and "144" not in num_str_set: final_result.extend(parent_map["14"]) # 插入14本身(确保它在1之后,141之前) if "14" not in final_result: final_result.insert(1, "14") # 第四部分:144 及其子项(如果存在) if "144" in num_str_set: final_result.append("144") final_result.extend(parent_map["144"]) # 第五部分:1440 及其子项(如果存在) if "1440" in num_str_set: final_result.append("1440") final_result.extend(parent_map["1440"]) # 转回数字类型 final_result_num = [int(item) for item in final_result] print(final_result_num)
代码解释
- 前缀匹配:用字符串集合
num_str_set实现O(1)时间复杂度的前缀存在性检查,确保匹配效率; - 父项映射:
parent_map存储每个短数字对应的子项列表,子项自动按数字排序; - 特殊排序处理:通过分阶段添加元素,确保当14的子项需要后置时,能精准插入到142所有项的后面;
- 兼容性:不管原始列表中是否存在1440、144,代码都能自动适配规则,输出符合要求的数组。
比如当你移除原始列表中的144和1440后,代码会自动把144010等数字归到14下,并放在142及其子项的后面,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Glenn
相关产品推荐
相关产品推荐

