You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现层级化数字数组的排序?校园项目技术求助

解决方案:构建带层级的相似数字数组

嘿,我来帮你搞定这个校园项目里的数组构建问题!先把你的需求再梳理清楚,确保我没理解偏差:

  1. 长度超过4位的数字(比如144010)需要归到最长的已存在的短前缀下(优先找4位前缀1440,不存在则找3位144,再不存在找2位14,以此类推);
  2. 当数字最终归到14下时,必须排在所有以142开头的数字(包括142本身和它的子项)之后。

实现思路

核心是两步:前缀匹配找父项 + 按规则排序输出:

  1. 将所有数字转为字符串,方便快速匹配前缀;
  2. 对每个长数字,从最长的4位前缀开始检查,找到第一个存在于原始列表中的前缀作为父项;
  3. 构建父项到子项的映射,对子项按数字顺序排序;
  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)

代码解释

  1. 前缀匹配:用字符串集合num_str_set实现O(1)时间复杂度的前缀存在性检查,确保匹配效率;
  2. 父项映射:parent_map存储每个短数字对应的子项列表,子项自动按数字排序;
  3. 特殊排序处理:通过分阶段添加元素,确保当14的子项需要后置时,能精准插入到142所有项的后面;
  4. 兼容性:不管原始列表中是否存在1440、144,代码都能自动适配规则,输出符合要求的数组。

比如当你移除原始列表中的144和1440后,代码会自动把144010等数字归到14下,并放在142及其子项的后面,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Glenn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:08:16