AI刷题-数字字符串格式化 | 豆包MarsCode AI 刷题

64 阅读3分钟

题目解析

问题具体解释

小M的任务是将用户输入的一串数字字符串格式化为带 千分位逗号 的形式,同时保留小数部分,并去除多余的前导零。以下是问题的关键点:

  1. 千分位逗号的意义

    • 为了便于阅读,较大的数字需要用逗号分隔。例如,1234567 格式化后应为 1,234,567
  2. 去除前导零

    • 如果输入的数字字符串前面有无用的零,这些零需要移除。例如,00001234 应变为 1234
  3. 小数部分的保留

    • 如果输入的数字包含小数部分(用 . 分隔整数和小数),小数部分需要保留,不需要添加逗号或其他格式化操作。例如,12345.6789 应变为 12,345.6789
  4. 无效输入的处理

    • 如果去掉前导零后,整个字符串为空或仅为 .,应返回合理的格式化结果,例如返回 "0"

注意点

输入字符串可能有以下特殊情况:

  • 以多余的零开头,例如 0000123

  • 仅为整数部分,例如 1234567

  • 包含小数部分,例如 12345.678

  • 没有实际数字(如全是零或只有小数点),例如 000.000.

解题思路

核心思路是 对数字字符串进行格式化,包括以下几步:

1. 去除前导零

  • 使用 s.lstrip('0') 去掉字符串 s 开头的所有 0。例如:

    • 输入 "0000123456",去掉前导零后为 "123456".
    • 如果去掉前导零后字符串为空(如输入全是零:"000"),直接返回 "0"

关键代码:

s = s.lstrip('0')
if not s:
    return "0"

2. 分离整数和小数部分

  • 使用 . 分割字符串,将数字分为两部分:

    • 整数部分(小数点前)。
    • 小数部分(小数点后)。
  • 如果没有小数点,整数部分直接是输入的整个字符串,小数部分为 None

关键代码:

if '.' in s:
    integer_part, decimal_part = s.split('.')
else:
    integer_part, decimal_part = s, None

3. 格式化整数部分

  • 利用 Python 的格式化功能 f"{int(integer_part):,}",将整数部分转为带千分位逗号的形式。

    • int(integer_part) 确保移除了任何可能的无效字符或多余零。

关键代码:

formatted_integer = f"{int(integer_part):,}"

4. 拼接结果

  • 如果有小数部分,则将格式化后的整数部分与小数部分拼接,用小数点 . 分隔。
  • 如果没有小数部分,则直接返回格式化后的整数部分。

关键代码:

if decimal_part is not None:
    return f"{formatted_integer}.{decimal_part}"
else:
    return formatted_integer

总结

按以下步骤实现任务:

  1. 去掉前导零(确保数字的有效性)。
  2. 分离整数和小数部分(便于分别格式化)。
  3. 格式化整数部分(添加千分位逗号)。
  4. 拼接整数和小数部分(返回最终格式化结果)。

代码性能

时间复杂度

  • 去掉前导零:O(n),其中 n 是字符串长度。
  • 分离小数部分:O(n)。
  • 格式化整数部分:O(m),其中 m 是整数部分的长度。

总复杂度为 O(n+m),在输入数字的长度为 10^6 时依然高效。

空间复杂度

使用了额外变量存储分离后的字符串,空间复杂度为 O(n)。

完整代码

def solution(s: str) -> str:
    # 去掉前导零
    s = s.lstrip('0')
    if not s:  # 如果去掉前导零后为空,返回 "0"
        return "0"
    
    # 分离整数部分和小数部分
    if '.' in s:
        integer_part, decimal_part = s.split('.')
    else:
        integer_part, decimal_part = s, None
    
    # 格式化整数部分
    formatted_integer = f"{int(integer_part):,}"
    
    # 拼接结果
    if decimal_part is not None:
        return f"{formatted_integer}.{decimal_part}"
    else:
        return formatted_integer

if __name__ == '__main__':
    # 测试样例
    print(solution("1294512.12412") == '1,294,512.12412')
    print(solution("0000123456789.99") == '123,456,789.99')
    print(solution("987654321") == '987,654,321')