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

Haskell实现:用下划线补全列表生成等长字符串

Haskell 补集位置填充下划线函数实现方案

需求拆解

要实现的函数核心逻辑:

  • 确定所有输入数字中的最大值,以此计算输出字符串的固定长度(最大值+1)
  • 对每个子列表,遍历0到最大值的所有索引位置
  • 存在的数字转为对应字符,缺失位置用_填充,最终拼接成字符串

完整实现代码

import Data.Set (fromList, member)

getString :: [[Int]] -> [String]
getString xs = map buildString xs
  where
    -- 计算所有输入数字的最大值,确定需要覆盖的索引范围
    maxNum = maximum (concat xs)
    -- 生成从0到最大值的完整索引序列
    allIndices = [0..maxNum]
    -- 为单个数字列表生成对应字符串
    buildString nums = map indexToChar allIndices
      where
        -- 将数字列表转为集合,提升存在性检查效率
        numSet = fromList nums
        -- 单个索引转字符:存在则转数字字符,否则用下划线
        indexToChar i = if member i numSet then head (show i) else '_'

代码解释

  1. 全局最大值计算:maximum (concat xs) 将所有子列表的数字合并后取最大值,确保输出字符串能覆盖所有可能的索引位置。
  2. 索引序列生成:[0..maxNum] 生成需要检查的完整位置列表,保证所有输出字符串长度一致。
  3. 集合优化查询:用fromList nums把每个子列表转为Set,相比直接用elem,集合的member操作查询效率更高(尤其是子列表元素较多时)。
  4. 字符映射:遍历每个索引,存在则把数字转为字符(head (show i)处理单个数字的字符串转换),缺失则填充_。

测试验证

输入示例:[[1, 2], [0, 1, 2, 3], [1, 3], [0, 2, 3]]
输出结果:["_12_", "0123", "_1_3", "0_23"],完全符合需求。

边缘情况处理

  • 子列表含重复数字:如[[1,1,2]],转为集合后仍保留唯一值,输出与[[1,2]]一致
  • 单个数字子列表:如[[5]],输出为"_____5"(长度为5+1=6)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:45:54