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

69 阅读3分钟

问题描述

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。

测试样例 样例1:

输入:s = "1294512.12412" 输出:'1,294,512.12412'

样例2:

输入:s = "0000123456789.99" 输出:'123,456,789.99'

样例3:

输入:s = "987654321" 输出:'987,654,321'

解答

def solution(s: str) -> str: # 去除前导零 s = s.lstrip('0') if s == '': s = '0'

# 分离整数和小数部分
if '.' in s:
    integer_part, fractional_part = s.split('.')
else:
    integer_part, fractional_part = s, ''

# 格式化整数部分
formatted_integer_part = ''
for i, char in enumerate(reversed(integer_part)):
    if i > 0 and i % 3 == 0:
        formatted_integer_part = ',' + formatted_integer_part
    formatted_integer_part = char + formatted_integer_part

# 合并整数和小数部分
if fractional_part:
    return f"{formatted_integer_part}.{fractional_part}"
else:
    return formatted_integer_part

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。

例如: 输入 "1294512.12412" 应该输出 "1,294,512.12412" 输入 "0000123456789.99" 应该输出 "123,456,789.99"

数据结构选择

字符串:输入和输出都是字符串格式。

列表:用于存储整数部分的各个部分,方便插入逗号。

算法步骤

去除前导零:使用 lstrip('0') 去除字符串前面的 0。如果去除后字符串为空,则将其设置为 '0'。

分离整数和小数部分:使用 split('.') 将字符串分为整数部分和小数部分。

格式化整数部分:

反转整数部分。 每三位插入一个逗号。 再次反转回来。 合并整数和小数部分:使用 f-string 将格式化后的整数部分和小数部分合并。

思路提示****

去除前导零: 使用 s.lstrip('0') 去除前导零。 如果去除后字符串为空,则将其设置为 '0'。

分离整数和小数部分: 使用 split('.') 将字符串分为整数部分和小数部分。 如果没有小数部分,则小数部分为空字符串。

格式化整数部分: 反转整数部分。 使用一个循环,每三位插入一个逗号。 再次反转回来。

合并整数和小数部分: 使用 f-string 将格式化后的整数部分和小数部分合并。

示例

假设输入为 "0000123456789.99":

去除前导零:"0000123456789.99" -> "123456789.99"

分离整数和小数部分:"123456789.99" -> "123456789" 和 "99"

格式化整数部分:

反转整数部分:"123456789" -> "987654321"

每三位插入逗号:"987654321" -> "987,654,321"

再次反转回来:"987,654,321" -> "123,456,789"

合并整数和小数部分:"123,456,789" 和 "99" -> "123,456,789.99"

通过这些步骤,可以逐步实现将数字字符串转换为带千分位逗号的格式,并且去除前面的无用 0。

反思

可进行以下优化

时间复杂度

去除前导零:O(n)

分离整数和小数部分:O(n)

格式化整数部分:O(n)

合并整数和小数部分:O(1)

总的时间复杂度仍然是 O(n),但通过避免反转操作,代码的执行效率有所提高。

空间复杂度

去除前导零:O(n)

分离整数和小数部分:O(n)

格式化整数部分:O(n)

合并整数和小数部分:O(1)

总的空间复杂度仍然是 O(n),但通过避免反转操作,减少了额外的空间开销。