ai刷题感悟|豆包MarsCode AI刷题

106 阅读5分钟

在学习的漫漫长路上,刷题一直是巩固知识、提升能力的重要手段。而当 MarksCode AI 走入我的刷题世界后,更是给我带来了一番别样且深刻的体验。 根据我的刷题经历来谈点感悟。

问题描述

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

    # 步骤1:处理前导零
    s = s.lstrip('0')
    
    # 如果去掉前导零后字符串为空,返回 "0"
    if s == '':
        return '0'
    
    # 步骤2:分割整数部分和小数部分
    if '.' in s:
        integer_part, decimal_part = s.split('.')
    else:
        integer_part, decimal_part = s, ''
    
    # 步骤3:为整数部分添加千分位逗号
    # 反转整数部分,分组,然后再反转回来
    integer_part = integer_part[::-1]  # 反转字符串
    grouped_integer = ','.join([integer_part[i:i+3] for i in range(0, len(integer_part), 3)])  # 每三位一组
    grouped_integer = grouped_integer[::-1]  # 再次反转
    
    # 步骤4:组合最终结果
    if decimal_part:  # 如果有小数部分
        return f"{grouped_integer}.{decimal_part}"
    else:
        return grouped_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')

代码步骤详细思路

  1. 处理前导零(步骤 1)

    • 使用字符串的 lstrip 方法去除输入字符串 s 左边的 0。例如,如果输入的字符串是 "000123.45",经过这一步操作后就会变成 "123.45"。这样做的目的是将有效数字部分前置,方便后续处理,避免前导零对后续添加千分位逗号等操作造成干扰。
    • 紧接着做了一个判断,如果去除前导零后字符串为空,说明原字符串可能全是 0,那就直接返回 "0"。比如输入 "0000",去除前导零后为空,按照规则返回 "0"
  2. 分割整数部分和小数部分(步骤 2)

    • 通过判断输入字符串 s 中是否包含小数点(.)来决定如何划分整数和小数部分。
    • 如果字符串中包含小数点,就使用字符串的 split 方法,以小数点为分隔符,将字符串拆分成两部分,分别赋值给 integer_part(整数部分)和 decimal_part(小数部分)。例如对于输入 "123.45",会得到 integer_part = "123" 和 decimal_part = "45"
    • 如果字符串中不包含小数点,那就意味着整个字符串都是整数部分,此时将整个字符串赋值给 integer_part,而 decimal_part 则赋值为空字符串。比如输入 "123",就会有 integer_part = "123" 和 decimal_part = ""
  3. 为整数部分添加千分位逗号(步骤 3)

    • 首先,将整数部分字符串 integer_part 进行反转,使用字符串切片操作 [::-1] 来实现反转功能。例如,整数部分原本是 "123456",反转后就变成 "654321"。这样做的好处是方便从左到右按每三位一组进行处理(因为 Python 中索引从左到右更符合常规的遍历习惯)。
    • 接着,使用列表推导式和 join 方法来实现分组添加逗号的操作。列表推导式 [integer_part[i:i+3] for i in range(0, len(integer_part), 3)] 会按照每三位一组对反转后的整数部分字符串进行切割,形成一个包含各个分组的列表。例如对于反转后的 "654321",会切割出 ["654", "321"](假设长度合适的情况)。然后通过 ','.join 将这些分组用逗号连接起来,得到类似 "654,321" 的字符串(这是反转后的带逗号分隔情况)。
    • 最后,再将这个已经添加逗号分隔的字符串再次反转回来,恢复到原本整数正常的顺序,得到最终添加好千分位逗号的整数部分字符串。
  4. 组合最终结果(步骤 4)

    • 通过判断 decimal_part 是否为空来决定最终返回的格式化字符串形式。
    • 如果 decimal_part 不为空,也就是原输入字符串是包含小数部分的,那就使用格式化字符串的方式(f-string)将处理好的整数部分 grouped_integer 和小数部分 decimal_part 按照原本的顺序组合起来,中间用小数点连接,例如返回 "123,456.789" 这样的结果形式。
    • 如果 decimal_part 为空,说明原输入字符串就是一个整数,直接返回已经处理好添加了千分位逗号的整数部分字符串 grouped_integer

根据marscode给的思路

`def solution(s): # 步骤1:处理前导零 s = s.lstrip('0')

# 如果去掉前导零后字符串为空,返回 "0"
if s == '':
    return '0'

# 步骤2:分割整数部分和小数部分
if '.' in s:
    integer_part, decimal_part = s.split('.')
else:
    integer_part, decimal_part = s, ''

# 步骤3:为整数部分添加千分位逗号
# 使用正则表达式来添加千分位逗号
import re
integer_part = re.sub(r'(\d)(?=(\d{3})+(?!\d))', r'\1,', integer_part)

# 步骤4:组合最终结果
if decimal_part:  # 如果有小数部分
    return f"{integer_part}.{decimal_part}"
else:
    return integer_part

基于它给的思路对代码进行改进后我认识到在它给出解答后,自己再重新梳理一遍思路,确保下次遇到类似题目能够独立完成。

从整体上来说,MarksCode AI 为我的刷题之旅增添了助力,让这个过程变得更加高效且富有成效。它是一个很棒的学习工具,在它的帮助下,我刷题时的畏难情绪减少了许多,对知识的掌握也更加扎实,学习的自信心也得到了极大的提升。我相信,只要合理利用好这样的智能工具,结合自身的努力,定能在学习的道路上不断迈进,收获更多的成长和进步。