青训营X豆包MarsCode 技术训练营第一课:数字字符格式化算法解析 | 豆包MarsCode AI 刷题

82 阅读2分钟

这个问题要求我们将用户输入的数字字符串进行格式化,转换为带有千分位逗号的格式,并且要确保:

  1. 去掉无用的前导零:例如,输入 "000123.45" 应转换为 "123.45"
  2. 添加千分位逗号:对于整数部分,每三位数字加一个逗号分隔。比如,1234567.89 应转换为 "1,234,567.89"
  3. 保留小数部分:小数部分需要准确保留,且无需处理其他的无效零,例如 123.4500 应转换为 123.45

解题思路:

  1. 处理前导零:可以通过 str.lstrip('0') 去除字符串中的无效零。如果只剩下空字符串,表示数字是零,应该返回 "0"
  2. 拆分整数和小数部分:使用 split('.') 将字符串分为整数和小数部分。整数部分进行千分位格式化,小数部分直接保留。
  3. 格式化整数部分:使用 Python 的格式化字符串,'{:,}',它能够自动为整数部分插入千分位逗号。
  4. 合并整数和小数部分:如果小数部分存在,合并整数和小数部分,中间用小数点连接。

示例:

  • 输入:"000123.456789"

  • 过程:

    1. 去掉前导零,得到 "123.456789"
    2. 整数部分 "123" 格式化为 "123"(不需要插入逗号)。
    3. 小数部分 .456789 保留不变。
    4. 输出:"123.456789"

代码实现(Python 示例):

pythonCopy Code
def format_number(number_str):
    # 去除前导零
    number_str = number_str.lstrip('0') or '0'  # 如果是零,返回'0'
    
    # 判断是否包含小数部分
    if '.' in number_str:
        integer_part, decimal_part = number_str.split('.')
    else:
        integer_part, decimal_part = number_str, ''
    
    # 格式化整数部分
    integer_part = '{:,}'.format(int(integer_part))
    
    # 合并整数部分和小数部分
    if decimal_part:
        return f'{integer_part}.{decimal_part}'
    else:
        return integer_part

# 测试
print(format_number("000123.456789"))  # 输出: "123.456789"
print(format_number("000000123"))      # 输出: "123"
print(format_number("0000.00"))        # 输出: "0.00"

时间复杂度:

  • 去除前导零和格式化整数部分的时间复杂度是 O(n),其中 n 是字符串的长度。