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

27 阅读3分钟

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

代码练习 — 豆包 MarsCode

简单题,试着使用了一下strconv包进行前置零的去除


问题描述

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转变为带千分位格式的字符串,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要去除。

输入要求

  • 输入为字符串形式的数字,可能包含整数和小数部分。

输出要求

  • 将输入的字符串格式化为以下规则:
    1. 整数部分按照千分位格式添加逗号。
    2. 小数部分保持原样。

测试样例

样例 1

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

样例 2

  • 输入:s = "00001234567889.99"
  • 输出:'1,234,567,889.99'

样例 3

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

算法分析(基于Go代码)

  1. 分割整数和小数部分

    • 通过 strings.Split(s, ".") 将字符串按照 . 分割为两部分:
      • 整数部分 $int\_part$
      • 小数部分 $dec\_part$(如果存在)。
  2. 处理整数部分

    • 利用 strconv.Atoi 去除整数部分的前导零,例如将 "000012345" 转化为 "12345"
    • 使用字符串操作逐字符反向添加 ,,每隔三位添加一个 ,
  3. 处理小数部分

    • 如果分割结果中存在小数部分,则保留原始格式。
  4. 拼接结果

    • 如果存在小数部分,则将处理后的整数部分和小数部分拼接。
    • 如果不存在小数部分,仅返回处理后的整数部分。
  5. 辅助函数

    • 使用辅助函数 reverse 实现字符串的反转,用于将反向构建的字符串调整为正向。

算法实现

Go代码

package main

import (
	"fmt"
	"strconv"
	"strings"
)

// 辅助函数:字符串翻转
func reverse(input string) string {
	bytes := []byte(input)
	for i, j := 0, len(bytes)-1; i < j; i, j = i+1, j-1 {
		bytes[i], bytes[j] = bytes[j], bytes[i]
	}
	return string(bytes)
}

func solution(s string) string {
	// 分割整数和小数部分
	strNum := strings.Split(s, ".")
	intPart := strNum[0]
	decPart := ""

	// 如果存在小数部分
	if len(strNum) == 2 {
		decPart = strNum[1]
	}

	// 去除整数部分前导零
	tempIntPart, _ := strconv.Atoi(intPart)
	intPart = strconv.Itoa(tempIntPart)

	// 添加千分位分隔符
	var builder strings.Builder
	cnt := 0
	for i := len(intPart) - 1; i >= 0; i-- {
		if cnt == 3 {
			builder.WriteByte(',')
			cnt = 0
		}
		builder.WriteByte(intPart[i])
		cnt++
	}

	// 反转回正顺序
	intPart = reverse(builder.String())

	// 拼接结果
	if len(strNum) == 2 {
		return intPart + "." + decPart
	} else {
		return intPart
	}
}

func main() {
	// 测试用例
	fmt.Println(solution("1294512.12412") == "1,294,512.12412")
	fmt.Println(solution("0000123456789.99") == "123,456,789.99")
	fmt.Println(solution("987654321") == "987,654,321")
}

Python代码

def solution(s: str) -> str:
    """
    将一个字符串表示的数字进行格式化:
    - 整数部分添加逗号分隔符。
    - 小数部分保持不变。
    """
    # 分割整数部分和小数部分
    parts = s.split(".")
    int_part = parts[0].lstrip("0") or "0"  # 去除前导零,如果结果为空,保留 "0"
    dec_part = parts[1] if len(parts) == 2 else ""  # 判断是否有小数部分

    # 添加逗号分隔符
    formatted_int_part = "{:,}".format(int(int_part))

    # 拼接结果
    if dec_part:
        return f"{formatted_int_part}.{dec_part}"
    else:
        return formatted_int_part


if __name__ == "__main__":
    # 测试用例
    print(solution("1294512.12412") == "1,294,512.12412")  # 应输出 True
    print(solution("0000123456789.99") == "123,456,789.99")  # 应输出 True
    print(solution("987654321") == "987,654,321")  # 应输出 True

复杂度分析

  • 时间复杂度
    • Go代码:字符串处理(如 Split 和逐字符添加)复杂度为 O(n)O(n),其中 nn 为输入字符串长度。
    • Python代码:通过内置格式化方法,复杂度也为 O(n)O(n)
  • 空间复杂度
    • 使用了辅助字符串构造工具,额外空间复杂度为 O(n)O(n)