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

140 阅读5分钟

1. 题目解析:

题目要求将输入的数字字符串进行格式化,去除无用的前导零并且保留小数部分,同时在整数部分每三位插入一个千分位逗号。这类问题可以归纳为字符串处理和格式化问题。我们需要注意的几个关键点包括:

  • 去除前导零: 需要判断字符串开头是否有多余的零,并移除它们。常见的做法是通过逐字符检查,直到遇到非零字符为止。
  • 分割整数和小数部分: 字符串中的小数点作为分隔符,整数部分和小数部分是两个不同的部分。处理时需要分割和分别处理它们。
  • 千分位格式化: 在整数部分,每隔三位插入一个逗号。可以利用字符串操作的方式反向遍历整数部分,然后按照每三位添加一个逗号。

这类题目的关键在于对字符串的操作,包括去除前导零、分割整数和小数部分、去除多余的零以及插入千分位逗号。

2. 代码详解:

题目的核心代码如下:

std::string solution(const std::string& s) {
    // 去除前导零
    size_t start = 0;
    while (start < s.size() && s[start] == '0') {
        start++;
    }
    string cleanedStr = s.substr(start);
    
    // 分割整数和小数部分
    size_t dotPos = cleanedStr.find('.');
    string integerPart = (dotPos == string::npos) ? cleanedStr : cleanedStr.substr(0, dotPos);
    string decimalPart = (dotPos == string::npos) ? "" : cleanedStr.substr(dotPos);
    
    // 去除小数部分多余的零
    while (decimalPart.size() > 1 && decimalPart.back() == '0') {
        decimalPart.pop_back();
    }
    
    // 格式化整数部分
    string formattedIntegerPart;
    int count = 0;
    for (int i = integerPart.size() - 1; i >= 0; --i) {
        formattedIntegerPart = integerPart[i] + formattedIntegerPart;
        count++;
        if (count % 3 == 0 && i != 0) {
            formattedIntegerPart = ',' + formattedIntegerPart;
        }
    }
    
    // 合并结果
    return formattedIntegerPart + decimalPart;
}

解析:

  1. 去除前导零: 使用 while 循环找到第一个非零字符,确保字符串格式正确。
  2. 分割整数和小数部分: 使用 find() 查找小数点的位置,并根据小数点是否存在来分别提取整数和小数部分。
  3. 去除小数部分的多余零: 利用 pop_back() 删除小数部分的末尾多余零。
  4. 整数部分千分位格式化: 从整数部分的末尾开始遍历,每三位加一个逗号。

3. 知识总结:

在解答这道题时,我总结了以下几点:

  • 字符串操作的熟练度: 在处理这类字符串格式化问题时,能够熟练使用 substr()find()pop_back() 等标准库函数,能够让代码更加简洁高效。
  • 反向遍历和插入操作: 在处理千分位格式化时,通过反向遍历整数部分并逐一插入逗号,避免了复杂的索引计算,增强了代码的可读性和可维护性。
  • 边界情况的处理: 在处理小数部分时,特别要注意去除末尾多余的零,同时也要保证如果没有小数部分时不插入不必要的小数点。

4. 学习计划:

结合豆包MarsCode AI刷题功能,我总结了以下高效学习方法:

  1. 制定刷题计划:

    • 按难度逐步提升: 初学者可以从简单的题目开始,逐步增加难度。比如,先从基础的字符串处理问题开始,再转向更复杂的算法题。
    • 定期复习和总结: 每做完一题,要进行总结,分析解题思路和关键代码,并把相关知识点记录下来。
  2. 利用错题进行针对性学习:

    • 分类错题: 在刷题过程中,记录下哪些题目是做错的,并分析出错的原因,是知识盲区、思路问题还是实现细节问题。
    • 逐步攻克错题: 针对错误的题目进行二次复习,直到能够正确理解并做对为止。
  3. 强化弱项:

    • 算法基础和数据结构: 定期做一些经典的算法和数据结构题目,巩固基础,避免仅停留在编程实现的层面。
    • 时间复杂度和空间复杂度分析: 在做题时,养成分析时间复杂度和空间复杂度的习惯,提高解决问题的效率。

5. 工具运用:

除了利用豆包MarsCode AI的刷题功能外,我还结合了其他学习资源,增强了学习效果:

  • 查看相关题解: 如果卡在某个问题上,可以查看题解和讨论,学习他人的思路和优化方法。
  • 查阅文档和书籍: 对于不熟悉的编程语言特性或算法,查阅相关文档和书籍,深入理解底层原理。
  • 利用在线编译器: 在没有IDE的情况下,使用在线编译器进行实验,灵活验证代码是否正确。

6. 学习建议:

  • 从易到难: 对初学者来说,避免一开始就选择太难的题目。先从基础做起,逐步积累知识,熟悉常见的题型。
  • 及时总结: 每完成一题,写下自己的总结,不仅是为了记住解决方案,还能帮助自己反思哪些地方做得不够好。
  • 错误即是学习的机会: 不要怕犯错,错题反而是提高的机会,通过总结错题,理解自己不懂的地方,从而避免重复犯错。

通过不断练习和总结,我相信自己能在编程的道路上越走越远,最终达到熟练掌握编程技巧的目标。