第二天刷题:数字字符串格式化 | 豆包MarsCode AI刷题

80 阅读2分钟

心得体会

在解决这道算法题的过程中,我学到了处理字符串格式转换的一些重要方法。题目的要求是将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,同时保留小数部分,并去掉前导的无效 0。这个问题表面上看似简单,但在细节处理上还是有一定的挑战。

题目分析与思路

首先,我的思路是将输入字符串进行如下几个步骤的处理:

  1. 去除前导零:这一步通过正则表达式 ^0+(?!$) 实现,该表达式可以移除前导的无用 0,但保留整个字符串为零的情况。
  2. 分离整数部分和小数部分:通过 split("\.") 将整数和小数部分分开,以便对整数部分单独处理。
  3. 添加千分位逗号:从整数部分的最后一个字符开始向前遍历,每隔三个字符插入一个逗号。这样从后往前加逗号就能保证每个逗号都出现在合适的位置。
  4. 拼接小数部分:如果存在小数部分,最后再将其与整数部分拼接,得到最终的结果。

代码详解

下面是实现的代码及其解释: public class Main { public static String solution(String s) { // 去除前导零 s = s.replaceFirst("^0+(?!$)", "");

    // 分离整数部分和小数部分
    String[] arr = s.split("\\.");
    String pre = arr[0]; // 整数部分
    String post = arr.length == 2 ? arr[1] : ""; // 小数部分
    
    StringBuilder result = new StringBuilder();
    int count = 0;
    
    // 插入千分位逗号
    for (int i = pre.length() - 1; i >= 0; i--) {
        result.insert(0, pre.charAt(i));
        count++;
        if (count == 3 && i != 0) {
            result.insert(0, ",");
            count = 0;
        }
    }
    
    // 拼接小数部分
    if (!post.isEmpty()) {
        result.append(".").append(post);
    }
    
    return result.toString();
}

public static void main(String[] args) {
    System.out.println(solution("1294512.12412").equals("1,294,512.12412"));
    System.out.println(solution("0000123456789.99").equals("123,456,789.99"));
    System.out.println(solution("987654321").equals("987,654,321"));
}

}

代码说明

  • 去除前导零:使用 s.replaceFirst("^0+(?!$)", "") 来移除前面的无用 0
  • 整数和小数部分的分割split("\.") 通过 . 分割字符串,如果有小数部分,post 会存储它,否则 post 为空。
  • 插入千分位逗号:我们从后向前遍历整数部分 pre,并每隔三位插入一个 ,,使用 StringBuilderinsert 方法可以高效地在指定位置插入字符。
  • 拼接小数部分:在 result 后追加小数部分。

学到的经验

  1. 字符串操作:熟悉 StringStringBuilder 的方法是关键。比如 replaceFirstinsert 方法在此题中就非常实用。
  2. 正则表达式:通过正则表达式进行前导零的去除是一种简洁的方法,同时保证了不影响整体的数字格式。
  3. 逻辑清晰的代码结构:将整数和小数部分分开处理,可以让代码逻辑更加简洁且不易出错。

总结

这道题不仅让我巩固了字符串操作的基本功,还让我意识到代码结构清晰的重要性。当面对多步处理需求时,分步操作、逐一实现每个功能能大大减少代码中的潜在错误。通过此次练习,我对如何在 Java 中灵活处理字符串操作有了更深的理解。