一、问题描述
小 M 在工作时遇到一个问题,需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。同时,有时候输入的数字字符串前面会有无用的0,这些也需要精简掉。
二、解题思路
-
首先去除数字字符串开头的无用
0。 -
如果去除后字符串为空,则返回
0。 -
将数字字符串按照小数点分为整数部分和小数部分。
-
对整数部分进行格式化,从后往前遍历整数部分,每三位数字添加一个逗号,注意特殊情况(最后一位数字和开头数字)。
-
如果有小数部分,则将格式化后的整数部分和小数部分拼接起来返回;如果没有小数部分,则直接返回格式化后的整数部分。
三、代码分析
def solution(s: str) -> str:
# 去除开头的无用 0
s = s.lstrip('0')
if s == '':
return '0'
parts = s.split('.')
integer_part = parts[0]
decimal_part = parts[1] if len(parts) > 1 else ''
# 格式化整数部分
formatted_integer = ''
count = 0
for i in range(len(integer_part)-1, -1, -1):
formatted_integer = integer_part[i] + formatted_integer
count += 1
if count % 3 == 0 and i!= 0:
formatted_integer = ',' + formatted_integer
if decimal_part:
return f'{formatted_integer}.{decimal_part}'
else:
return formatted_integer
- 首先使用
lstrip('0')方法去除字符串开头的无用0。 - 接着判断去除后的字符串是否为空,如果为空则返回
0。 - 使用
split('.')方法将字符串按照小数点分为整数部分和小数部分。 - 然后对整数部分进行格式化,从后往前遍历整数部分,每三位数字添加一个逗号,通过计数器
count来判断是否需要添加逗号。 - 最后根据是否有小数部分,决定返回的结果。
四、测试样例
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')
这些测试样例覆盖了不同情况的数字字符串,包括有小数部分和没有小数部分的情况,以及需要去除开头无用0的情况。
五、复杂度分析
-
时间复杂度:主要的时间消耗在对整数部分的遍历和格式化上,时间复杂度为O(n),其中
n为整数部分的长度。 -
空间复杂度:代码中使用了一些额外的变量来存储格式化后的整数部分和小数部分,空间复杂度为O(n),其中
n为整数部分的长度加上小数部分的长度。
六、总结与收获
-
问题解决能力:通过这个问题的解决,我们学会了如何处理数字字符串的格式化问题。从去除无用字符到按特定规则进行格式化,锻炼了我们分析问题和设计解决方案的能力。
-
字符串处理技巧:在这个过程中,我们熟悉了字符串的一些常用方法,如
lstrip()用于去除字符串开头的特定字符,split()用于按照指定字符分割字符串。 -
遍历与计数:对整数部分的从后往前遍历以及使用计数器来判断添加逗号的位置,让我们更加熟练地掌握了循环和计数的技巧,能够灵活地处理类似的格式化需求。
-
条件判断与返回值:根据不同的情况进行条件判断,决定返回不同的结果,提高了我们对程序流程控制的理解和运用能力。
总之,通过这个问题的解决,我们不仅掌握了数字字符串格式化的具体方法,还提升了在字符串处理、循环遍历、条件判断等方面的编程能力。