一,题目详情
1,问题描述
小M在工作中遇到了一个需求:将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,同时保留小数部分。此外,输入的数字字符串可能包含前导零,这些零需要被精简掉。请你帮助小M编写一个程序,完成这个任务。
2,测试样例
样例 1
s = "1294512.12412"
'1,294,512.12412'
样例 2
s = "0000123456789.99"
'123,456,789.99'
样例 3
s = "987654321"
'987,654,321'
二,解题思路
1,问题分析
-
输入特性:
- 可能包含前导零(如
0000123456789.99)。 - 可能包含小数部分(如
1294512.12412)。
- 可能包含前导零(如
-
输出要求:
- 整数部分添加千分位逗号。
- 小数部分保留原样。
- 去除前导零。
2,详情分析
-
分割字符串:将输入字符串分为整数部分和小数部分。
-
处理整数部分:
- 去除前导零。
- 使用 Python 的
format函数添加千分位逗号。
-
处理小数部分:保留原样。
-
合并结果:将格式化后的整数部分与小数部分拼接。
三,代码实现
def solution(s: str) -> str:
# 分割整数和小数部分
parts = s.split('.', 1)
integer_part = parts[0]
decimal_part = parts[1] if len(parts) > 1 else ''
# 处理整数部分:去除前导零,若全为零则保留一个0
stripped_integer = integer_part.lstrip('0') or '0'
# 格式化为带千分位逗号的字符串
formatted_integer = format(int(stripped_integer), ',')
# 合并小数部分
if decimal_part:
return f"{formatted_integer}.{decimal_part}"
else:
return formatted_integer
1,逐步推演(以样例2为例)
输入 s = "0000123456789.99",推演过程如下:
| 步骤 | 操作 | 结果 |
|---|---|---|
| 1 | 分割字符串 | integer_part = "0000123456789", decimal_part = "99" |
| 2 | 去除整数部分前导零 | stripped_integer = "123456789" |
| 3 | 格式化整数部分 | formatted_integer = "123,456,789" |
| 4 | 合并小数部分 | "123,456,789.99" |
最终结果为 '123,456,789.99',与预期一致。
2,复杂度分析
-
时间复杂度:O(n)
- 分割字符串、去除前导零、格式化整数部分均为线性操作。
-
空间复杂度:O(1)
- 仅使用常数级额外空间。
3,测试验证
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')
# 边界测试
print(solution("0.123") == '0.123') # 测试前导零和小数部分
print(solution("0000") == '0') # 测试全零的整数部分
print(solution("123") == '123') # 测试无小数部分
四,总结
通过分割字符串、去除前导零、格式化整数部分以及合并小数部分,我们实现了一个高效且简洁的解决方案。该算法具有以下特点:
- 高效性:时间复杂度为 O(n),空间复杂度为 O(1)。
- 鲁棒性:能够处理包含前导零和小数部分的输入。
- 易读性:代码逻辑清晰,易于理解和维护。
这种解法不仅适用于小M的需求,还可以广泛应用于类似的数据格式化场景中。