AI刷题的自我反思(一):
问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
样例1:
输入:s = "1294512.12412" 输出:'1,294,512.12412'
针对问题的思路:
- 字符串处理:由于我们需要对字符串进行插入和删除操作,字符串是最合适的数据结构。
- 分离整数和小数部分:可以使用字符串的
split方法将整数部分和小数部分分离。 - 所需的操作有,添加千分位逗号,分析是否有无用的0,将其精简掉。
算法步骤
去除前导零:使用 lstrip('0') 方法去除字符串前面的 0。
分离整数和小数部分:使用 split('.') 方法将字符串分为整数部分和小数部分。
添加千分位逗号:
- 反转整数部分以便从后往前处理。
- 使用 `join` 和 `range` 方法每三位添加一个逗号。
- 再次反转回来得到正确的整数格式。
合并结果:将处理后的整数部分和小数部分重新合并。
代码实现
# 去除前导零
s = s.lstrip('0')
# 分离整数和小数部分
if '.' in s:
integer_part, fractional_part = s.split('.')
else:
integer_part, fractional_part = s, ''
# 对整数部分添加千分位逗号
if integer_part:
integer_part = ''.join(reversed(integer_part)) # 反转整数部分
integer_part = ','.join(integer_part[i:i+3] for i in range(0, len(integer_part), 3)) # 每三位添加逗号
integer_part = ''.join(reversed(integer_part)) # 再次反转回来
# 合并结果
result = integer_part
if fractional_part:
result += '.' + fractional_part
return result
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')
代码解释
-
去除前导零:
s.lstrip('0'):去除字符串s前面的零。如果去除后字符串为空,则重新赋值为'0'。
-
转换为浮点数:
float(s):将处理后的字符串转换为浮点数。
-
格式化输出:
"{:,.12f}".format(num):将浮点数格式化为带千分位逗号的格式,保留小数点后12位。12f表示小数点后保留12位,','表示每三位插入一个逗号。
感悟
-
逻辑清晰:
- 问题分解成明确的步骤,逻辑清晰。
- 条件判断清晰,易于理解和实现。
-
代码简洁:
- 使用简单的条件判断语句,代码简洁易读。
- 使用内置函数和标准库,减少代码复杂度。
-
边界情况:
- 考虑边界情况,确保代码在各种情况下都能正确运行。
- 测试多种边界情况,如数组为空、区间范围极小或极大等。
-
测试样例:
- 提供多种测试样例,确保代码在不同情况下都能正确工作。
- 特别关注边界情况,如数组中只有两个或更少的偶数。