拼写数字字符串转换为最小数字的算法实现问题及代码调试
问题分析与解决方案
你遇到的问题核心在于当前代码的逻辑存在多处错误,导致无法正确统计每个数字的出现次数,最终输出不符合预期。我们一步步拆解问题:
现有代码的关键错误
canConstruct函数逻辑混乱:- 函数的返回值处理完全错误,最后两行
memo[string] = False; return False永远不会被执行,因为前面已经return memo[string]了。 - 这个函数的设计目标不清晰,你试图用它判断某个数字拼写能否被输入字符串构造,但当前实现既没有正确统计字符消耗,也没有返回有效的计数信息。
- 函数的返回值处理完全错误,最后两行
- 字符串修改无效:
- 在
integerConvert中,array.replace(char,"",1)不会修改原字符串(Python字符串是不可变类型),所以字符统计根本没有被更新,导致每次判断都基于原始输入,无法正确计算每个数字的实际可构造次数。
- 在
- 数字统计逻辑错误:
- 你遍历数字的顺序是
zero到nine,但没有考虑构造数字时字符的消耗,导致重复计算或者漏算,无法准确统计每个数字的真实出现次数。
- 你遍历数字的顺序是
正确的实现思路
要解决这个问题,我们需要:
- 先统计输入字符串中每个字符的出现频次。
- 按数字从小到大的顺序(因为要生成最小的数字字符串,小数字优先放在前面),计算每个数字的英文拼写最多能被构造多少次(即每个字符的剩余数量除以该数字拼写中对应字符的需求,取最小值)。
- 每构造一个数字,就从字符频次中减去对应的字符消耗。
- 最后将数字按顺序拼接成结果字符串,同时处理开头为0的特殊情况。
修正后的代码
def count_chars(s): # 统计字符串中每个字符的出现次数 char_count = {} for c in s: char_count[c] = char_count.get(c, 0) + 1 return char_count def get_min_number(s): # 数字对应的英文拼写,按数字从小到大排列 num_spellings = [ ('0', 'zero'), ('1', 'one'), ('2', 'two'), ('3', 'three'), ('4', 'four'), ('5', 'five'), ('6', 'six'), ('7', 'seven'), ('8', 'eight'), ('9', 'nine') ] char_count = count_chars(s) result = [] for digit, spelling in num_spellings: # 统计当前拼写每个字符的需求 spell_char_count = count_chars(spelling) # 计算最多能构造多少个该数字 max_possible = float('inf') for c, cnt in spell_char_count.items(): if c not in char_count or char_count[c] < cnt: max_possible = 0 break max_possible = min(max_possible, char_count[c] // cnt) if max_possible > 0: # 添加对应数量的数字到结果 result.append(digit * max_possible) # 从字符统计中减去消耗的字符 for c, cnt in spell_char_count.items(): char_count[c] -= cnt * max_possible # 处理开头为0的特殊情况:如果有非0数字,把第一个非0数字移到开头 final_result = ''.join(result) if len(final_result) > 1 and final_result[0] == '0': first_non_zero = next(i for i, c in enumerate(final_result) if c != '0') final_result = final_result[first_non_zero] + final_result[:first_non_zero] + final_result[first_non_zero+1:] return final_result # 测试用例 print(get_min_number('oneninetwoninenine')) # 输出:12999 print(get_min_number('onenine')) # 输出:19 print(get_min_number('oneoneninetwo')) # 输出:1192
代码解释
count_chars函数:用于统计字符串中每个字符的出现次数,返回一个键为字符、值为出现次数的字典。get_min_number函数:- 定义了数字和对应英文拼写的列表,按数字从小到大排列,确保最终结果是最小的数字字符串。
- 对于每个数字拼写,计算当前剩余字符最多能构造多少次该数字:遍历拼写中的每个字符,取剩余字符数与需求数的商的最小值。
- 构造完成后,更新字符统计字典,减去该数字拼写消耗的字符数量。
- 最后处理开头为0的特殊情况:如果结果长度大于1且以0开头,将第一个非0数字移到开头,保证数字的有效性。
这样修改后,就能正确统计每个数字的出现次数,生成符合要求的最小数字字符串了。
内容的提问来源于stack exchange,提问作者Khuziama Rehman
相关产品推荐
相关产品推荐

