题目解析: 这是一道字符串处理问题,主要涉及到数字格式化,需要处理以下几个关键点:
- 去除前导零
- 在整数部分每三位添加千分位逗号
- 保留原有的小数部分
- 需要处理有小数点和无小数点的情况
关键特征分析:
- 输入是字符串,不是数字类型
- 可能存在前导零
- 可能存在小数部分
- 需要从右向左每三位添加逗号
- 输出也是字符串格式
解题思路分析:
-
基本思路:
- 先处理前导零
- 分离整数部分和小数部分
- 处理整数部分的千分位
- 最后合并结果
-
详细步骤: a) 字符串预处理:
- 分割字符串为整数部分和小数部分
- 去除整数部分的前导零
b) 处理整数部分:
- 从右向左每三位添加一个逗号
- 注意最左边的数字组可能不足三位
c) 结果合并:
- 如果有小数部分,需要加上小数点和小数部分
- 如果没有小数部分,直接返回处理后的整数部分
-
实现方案(多种方案):
方案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
算法复杂度分析:
-
时间复杂度:O(n)
- 需要遍历整个字符串一次
- 字符串切片和拼接操作也是线性时间
-
空间复杂度:O(n)
- 需要存储处理后的字符串
- 临时数组或字符串的空间
需要注意的边界情况:
- 输入全是零的情况
- 没有小数点的情况
- 只有小数点的情况
- 数字长度小于3的情况
- 空字符串输入
代码优化建议:
-
输入验证:
- 检查输入是否为有效的数字字符串
- 处理异常情况
-
性能优化:
- 使用StringBuilder或list来构建结果
- 避免过多的字符串拼接操作
-
可读性优化:
- 添加适当的注释
- 使用有意义的变量名
- 将复杂逻辑拆分为小函数
实际应用场景:
- 金融系统中的数字显示
- 报表生成系统
- 数据可视化展示
- 用户界面数字格式化
测试用例建议:
-
基本测试:
- 正常的整数:"123456789"
- 带小数的数字:"1234.5678"
- 有前导零的数字:"00123.45"
-
边界测试:
- 零:"0"
- 小于1000的数:"999"
- 很长的数字:"123456789012345"
-
特殊情况:
- 只有小数部分:".123"
- 全是零:"000000"
- 空字符串:""
总结: 这是一道综合性的字符串处理问题,考察了:
- 字符串基本操作的掌握
- 边界情况的处理能力
- 代码的可维护性和健壮性
- 性能优化的意识
通过这道题,我们可以学习到:
- 如何分步骤解决复杂问题
- 字符串处理的常用技巧
- 代码优化的多个维度
- 实际应用中的考虑因素