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

108 阅读3分钟

解题思路

为了解决这个问题,我们需要拆解任务并逐步进行处理,具体步骤如下:

  1. 去除前导零:

    • 可以使用 lstrip('0') 方法将数字字符串中的前导零去除,避免无效的零对格式化产生影响。
  2. 拆分整数部分和小数部分:

    • 如果字符串中包含小数点(即有小数部分),我们需要将其拆分为整数部分和小数部分。
    • 对于没有小数部分的数字,我们只需要处理整数部分。
  3. 千分位格式化:

    • 对于整数部分,可以通过 Python 的字符串格式化功能(例如 '{:,}'.format())实现每三位插入一个逗号。
    • 小数部分无需进行格式化,只需要保留原样。
  4. 组合结果:

    • 将格式化后的整数部分和小数部分合并。如果有小数部分,连接时使用 . 作为分隔符。

代码实现

python
复制代码
def solution(s: str) -> str:
    # 去掉前导零
    s = s.lstrip('0')
    
    # 如果没有小数点,则直接处理整数部分
    if '.' in s:
        integer_part, decimal_part = s.split('.')
    else:
        integer_part, decimal_part = s, ""
    
    # 格式化整数部分,添加千分位逗号
    integer_part = '{:,}'.format(int(integer_part))
    
    # 处理小数部分,如果存在,合并整数部分和小数部分
    if decimal_part:
        return f"{integer_part}.{decimal_part}"
    else:
        return integer_part


# 测试用例
print(solution("1294512.12412") == '1,294,512.12412')  # 输出:'1,294,512.12412'
print(solution("0000123456789.99") == '123,456,789.99')  # 输出:'123,456,789.99'
print(solution("987654321") == '987,654,321')  # 输出:'987,654,321'

代码解析

  1. 去除前导零:

    • 使用 s.lstrip('0') 去除输入字符串 s 中的前导零。例如,"0000123456789.99" 被转化为 "123456789.99"
  2. 拆分整数部分和小数部分:

    • 使用 split('.') 将字符串按照小数点拆分成整数部分和小数部分。如果没有小数点,则默认小数部分为空字符串。
  3. 千分位格式化:

    • 使用 '{:,}'.format(int(integer_part)) 将整数部分格式化为带千分位的字符串。int(integer_part) 将整数部分转换为整数,然后通过 format() 进行格式化。
  4. 返回格式化后的结果:

    • 如果有小数部分,则通过 f"{integer_part}.{decimal_part}" 将格式化后的整数部分和原始的小数部分连接起来。
    • 如果没有小数部分,直接返回格式化后的整数部分。

复杂度分析

  • 时间复杂度: O(n),其中 n 是输入字符串的长度。我们遍历了一次字符串来去除前导零,然后拆分和格式化整数部分,所有操作都只需要对字符串进行线性扫描。
  • 空间复杂度: O(n),主要是由于在处理过程中,我们会生成新的格式化字符串,存储这些字符串需要一定的空间。

总结

这道题考察了字符串的处理能力,特别是数字字符串的格式化。通过利用 Python 强大的字符串格式化功能,可以有效地实现千分位的插入和小数部分的保留。此外,去除前导零和拆分整数部分与小数部分的操作也非常重要,可以确保最终的输出格式符合要求。