题目解析
问题具体解释
小M的任务是将用户输入的一串数字字符串格式化为带 千分位逗号 的形式,同时保留小数部分,并去除多余的前导零。以下是问题的关键点:
-
千分位逗号的意义:
- 为了便于阅读,较大的数字需要用逗号分隔。例如,
1234567格式化后应为1,234,567。
- 为了便于阅读,较大的数字需要用逗号分隔。例如,
-
去除前导零:
- 如果输入的数字字符串前面有无用的零,这些零需要移除。例如,
00001234应变为1234。
- 如果输入的数字字符串前面有无用的零,这些零需要移除。例如,
-
小数部分的保留:
- 如果输入的数字包含小数部分(用
.分隔整数和小数),小数部分需要保留,不需要添加逗号或其他格式化操作。例如,12345.6789应变为12,345.6789。
- 如果输入的数字包含小数部分(用
-
无效输入的处理:
- 如果去掉前导零后,整个字符串为空或仅为
.,应返回合理的格式化结果,例如返回"0"。
- 如果去掉前导零后,整个字符串为空或仅为
注意点
输入字符串可能有以下特殊情况:
-
以多余的零开头,例如
0000123。 -
仅为整数部分,例如
1234567。 -
包含小数部分,例如
12345.678。 -
没有实际数字(如全是零或只有小数点),例如
000.000或.。
解题思路
核心思路是 对数字字符串进行格式化,包括以下几步:
1. 去除前导零
-
使用
s.lstrip('0')去掉字符串s开头的所有0。例如:- 输入
"0000123456",去掉前导零后为"123456". - 如果去掉前导零后字符串为空(如输入全是零:
"000"),直接返回"0"。
- 输入
关键代码:
s = s.lstrip('0')
if not s:
return "0"
2. 分离整数和小数部分
-
使用
.分割字符串,将数字分为两部分:- 整数部分(小数点前)。
- 小数部分(小数点后)。
-
如果没有小数点,整数部分直接是输入的整个字符串,小数部分为
None。
关键代码:
if '.' in s:
integer_part, decimal_part = s.split('.')
else:
integer_part, decimal_part = s, None
3. 格式化整数部分
-
利用 Python 的格式化功能
f"{int(integer_part):,}",将整数部分转为带千分位逗号的形式。int(integer_part)确保移除了任何可能的无效字符或多余零。
关键代码:
formatted_integer = f"{int(integer_part):,}"
4. 拼接结果
- 如果有小数部分,则将格式化后的整数部分与小数部分拼接,用小数点
.分隔。 - 如果没有小数部分,则直接返回格式化后的整数部分。
关键代码:
if decimal_part is not None:
return f"{formatted_integer}.{decimal_part}"
else:
return formatted_integer
总结
按以下步骤实现任务:
- 去掉前导零(确保数字的有效性)。
- 分离整数和小数部分(便于分别格式化)。
- 格式化整数部分(添加千分位逗号)。
- 拼接整数和小数部分(返回最终格式化结果)。
代码性能
时间复杂度
- 去掉前导零:O(n),其中 n 是字符串长度。
- 分离小数部分:O(n)。
- 格式化整数部分:O(m),其中 m 是整数部分的长度。
总复杂度为 O(n+m),在输入数字的长度为 10^6 时依然高效。
空间复杂度
使用了额外变量存储分离后的字符串,空间复杂度为 O(n)。
完整代码
def solution(s: str) -> str:
# 去掉前导零
s = s.lstrip('0')
if not s: # 如果去掉前导零后为空,返回 "0"
return "0"
# 分离整数部分和小数部分
if '.' in s:
integer_part, decimal_part = s.split('.')
else:
integer_part, decimal_part = s, None
# 格式化整数部分
formatted_integer = f"{int(integer_part):,}"
# 拼接结果
if decimal_part is not None:
return f"{formatted_integer}.{decimal_part}"
else:
return formatted_integer
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')