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 '_'
代码解释
- 全局最大值计算:
maximum (concat xs)将所有子列表的数字合并后取最大值,确保输出字符串能覆盖所有可能的索引位置。 - 索引序列生成:
[0..maxNum]生成需要检查的完整位置列表,保证所有输出字符串长度一致。 - 集合优化查询:用
fromList nums把每个子列表转为Set,相比直接用elem,集合的member操作查询效率更高(尤其是子列表元素较多时)。 - 字符映射:遍历每个索引,存在则把数字转为字符(
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
相关产品推荐
相关产品推荐

