AI刷题完美整数题解| 豆包MarsCode AI刷题

55 阅读3分钟

最佳人选

问题描述

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

分析题目

题目要求我们将一个不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。此外,输入的数字字符串前面可能会有无用的 0,这些 0 需要被精简掉。

测试样例

样例1:

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

样例2:

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

样例3:

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

数据结构选择

  • 字符串:由于我们需要处理字符串的格式化,字符串是最直接的数据结构。
  • StringBuilder:在处理字符串拼接时,StringBuilder 比直接使用字符串拼接更高效。

算法设计

  1. 去除前导零:使用正则表达式去除字符串前面的无用 0
  2. 分割整数和小数部分:使用 split 方法将字符串分割为整数部分和小数部分。
  3. 格式化整数部分:从后往前遍历整数部分,每三位插入一个逗号。
  4. 拼接结果:将格式化后的整数部分和小数部分拼接起来。

具体步骤

  1. 去除前导零

    • 使用正则表达式 ^0+(?!$) 匹配字符串开头的 0,并将其替换为空字符串。
  2. 分割整数和小数部分

    • 使用 split("\.") 方法将字符串分割为整数部分和小数部分。
  3. 格式化整数部分

    • 使用 StringBuilder 从后往前遍历整数部分,每三位插入一个逗号。
  4. 拼接结果

    • 将格式化后的整数部分和小数部分拼接起来,返回结果。

代码展示

    public class Main {
public static String solution(String s) {
    // 去除前导零
    s = s.replaceFirst("^0+(?!$)", "");

    String[] parts = s.split("\\.");
    String integerPart = parts[0];
    String decimalPart = parts.length > 1 ? "." + parts[1] : "";

    // 格式化整数部分
    StringBuilder formattedIntegerPart = new StringBuilder();
    int len = integerPart.length();
    for (int i = 0; i < len; i++) {
        if (i > 0 && (len - i) % 3 == 0) {
            formattedIntegerPart.append(",");
        }
        formattedIntegerPart.append(integerPart.charAt(i));
    }

    // 拼接结果
    return formattedIntegerPart.toString() + decimalPart;
}

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"));
}

优化设计

  1. 去除前导零

    • 使用 Long.parseLong 方法将整数部分转换为 long 类型,这样可以自动去除前导零。
  2. 分割整数和小数部分

    • 使用 indexOf(".") 方法找到小数点的位置,然后分别处理整数部分和小数部分。
  3. 格式化整数部分

    • 使用 String.format 方法格式化整数部分,这样可以自动插入千分位逗号。
  4. 拼接结果

    • 直接使用 + 运算符拼接整数部分和小数部分。

知识点总结

  1. 字符串处理

    • 字符串分割:使用 split 方法将字符串分割为整数部分和小数部分。
    • 字符串拼接:使用 StringBuilder 或 + 运算符拼接字符串。
    • 字符串替换:使用 replaceFirst 方法去除字符串前面的无用 0
  2. 正则表达式

    • 正则匹配:使用正则表达式 ^0+(?!$) 匹配字符串开头的 0,并将其替换为空字符串。
  3. 数据结构

    • StringBuilder:在处理字符串拼接时,StringBuilder 比直接使用字符串拼接更高效。
  4. 格式化输出

    • 格式化整数:使用 String.format 方法格式化整数部分,自动插入千分位逗号。