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

57 阅读3分钟

题目解析: 这是一道字符串处理问题,主要涉及到数字格式化,需要处理以下几个关键点:

  1. 去除前导零
  2. 在整数部分每三位添加千分位逗号
  3. 保留原有的小数部分
  4. 需要处理有小数点和无小数点的情况

关键特征分析:

  1. 输入是字符串,不是数字类型
  2. 可能存在前导零
  3. 可能存在小数部分
  4. 需要从右向左每三位添加逗号
  5. 输出也是字符串格式

解题思路分析:

  1. 基本思路:

    • 先处理前导零
    • 分离整数部分和小数部分
    • 处理整数部分的千分位
    • 最后合并结果
  2. 详细步骤: a) 字符串预处理:

    • 分割字符串为整数部分和小数部分
    • 去除整数部分的前导零

    b) 处理整数部分:

    • 从右向左每三位添加一个逗号
    • 注意最左边的数字组可能不足三位

    c) 结果合并:

    • 如果有小数部分,需要加上小数点和小数部分
    • 如果没有小数部分,直接返回处理后的整数部分
  3. 实现方案(多种方案):

方案1:字符串反转法

python
CopyInsert
def format_number(s):
    # 分割整数部分和小数部分
    parts = s.split('.')
    integer_part = parts[0].lstrip('0')
    if not integer_part:
        integer_part = '0'
    
    # 反转整数部分
    reversed_int = integer_part[::-1]
    
    # 每三位添加逗号
    groups = [reversed_int[i:i+3] for i in range(0, len(reversed_int), 3)]
    formatted_int = ','.join(groups)[::-1]
    
    # 合并结果
    if len(parts) > 1:
        return formatted_int + '.' + parts[1]
    return formatted_int

方案2:从右向左遍历法

python
CopyInsert
def format_number(s):
    # 分割整数和小数部分
    parts = s.split('.')
    integer_part = parts[0].lstrip('0')
    if not integer_part:
        integer_part = '0'
    
    # 处理整数部分
    result = []
    for i in range(len(integer_part)-1, -1, -1):
        if i != len(integer_part)-1 and (len(integer_part)-i-1) % 3 == 0:
            result.append(',')
        result.append(integer_part[i])
    
    formatted_int = ''.join(result[::-1])
    
    # 合并结果
    if len(parts) > 1:
        return formatted_int + '.' + parts[1]
    return formatted_int

方案3:使用内置函数(不推荐,因为可能不是所有环境都支持)

python
CopyInsert
def format_number(s):
    parts = s.split('.')
    integer_part = str(int(parts[0]))  # 去除前导零
    formatted_int = "{:,}".format(int(integer_part))
    
    if len(parts) > 1:
        return formatted_int + '.' + parts[1]
    return formatted_int

算法复杂度分析:

  1. 时间复杂度:O(n)

    • 需要遍历整个字符串一次
    • 字符串切片和拼接操作也是线性时间
  2. 空间复杂度:O(n)

    • 需要存储处理后的字符串
    • 临时数组或字符串的空间

需要注意的边界情况:

  1. 输入全是零的情况
  2. 没有小数点的情况
  3. 只有小数点的情况
  4. 数字长度小于3的情况
  5. 空字符串输入

代码优化建议:

  1. 输入验证:

    • 检查输入是否为有效的数字字符串
    • 处理异常情况
  2. 性能优化:

    • 使用StringBuilder或list来构建结果
    • 避免过多的字符串拼接操作
  3. 可读性优化:

    • 添加适当的注释
    • 使用有意义的变量名
    • 将复杂逻辑拆分为小函数

实际应用场景:

  1. 金融系统中的数字显示
  2. 报表生成系统
  3. 数据可视化展示
  4. 用户界面数字格式化

测试用例建议:

  1. 基本测试:

    • 正常的整数:"123456789"
    • 带小数的数字:"1234.5678"
    • 有前导零的数字:"00123.45"
  2. 边界测试:

    • 零:"0"
    • 小于1000的数:"999"
    • 很长的数字:"123456789012345"
  3. 特殊情况:

    • 只有小数部分:".123"
    • 全是零:"000000"
    • 空字符串:""

总结: 这是一道综合性的字符串处理问题,考察了:

  1. 字符串基本操作的掌握
  2. 边界情况的处理能力
  3. 代码的可维护性和健壮性
  4. 性能优化的意识

通过这道题,我们可以学习到:

  1. 如何分步骤解决复杂问题
  2. 字符串处理的常用技巧
  3. 代码优化的多个维度
  4. 实际应用中的考虑因素