LeetCode 273. 整数转换英文表示

题目描述

273. 整数转换英文表示

思路分析

解法一:分段处理(推荐)

核心思路

  • 将数字按 Billion/Million/Thousand 分段。
  • 每段最多 3 位,用固定映射表转换成英文单词。
  • 拼接时注意空格与零值段的处理。


复杂度分析

  • 时间复杂度:O(1),数字位数固定。
  • 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
    private static final String[] LESS_THAN_20 = {
            "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine",
            "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen",
            "Seventeen", "Eighteen", "Nineteen"
    };

    private static final String[] TENS = {
            "", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"
    };

    public String numberToWords(int num) {
        if (num == 0) {
            return "Zero";
        }

        return build(num).trim();
    }

    private String build(int num) {
        StringBuilder sb = new StringBuilder();

        if (num >= 1_000_000_000) {
            sb.append(build(num / 1_000_000_000)).append(" Billion ");
            num %= 1_000_000_000;
        }
        if (num >= 1_000_000) {
            sb.append(build(num / 1_000_000)).append(" Million ");
            num %= 1_000_000;
        }
        if (num >= 1_000) {
            sb.append(build(num / 1_000)).append(" Thousand ");
            num %= 1_000;
        }

        if (num >= 100) {
            sb.append(LESS_THAN_20[num / 100]).append(" Hundred ");
            num %= 100;
        }
        if (num >= 20) {
            sb.append(TENS[num / 10]).append(" ");
            num %= 10;
        }
        if (num > 0) {
            sb.append(LESS_THAN_20[num]).append(" ");
        }

        return sb.toString();
    }
}
func numberToWords(num int) string {
    if num == 0 {
        return "Zero"
    }

    return strings.TrimSpace(build(num))
}

var lessThan20 = []string{
    "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine",
    "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen",
    "Seventeen", "Eighteen", "Nineteen",
}

var tens = []string{
    "", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety",
}

func build(num int) string {
    sb := strings.Builder{}

    if num >= 1_000_000_000 {
        sb.WriteString(build(num/1_000_000_000))
        sb.WriteString(" Billion ")
        num %= 1_000_000_000
    }
    if num >= 1_000_000 {
        sb.WriteString(build(num/1_000_000))
        sb.WriteString(" Million ")
        num %= 1_000_000
    }
    if num >= 1_000 {
        sb.WriteString(build(num/1_000))
        sb.WriteString(" Thousand ")
        num %= 1_000
    }

    if num >= 100 {
        sb.WriteString(lessThan20[num/100])
        sb.WriteString(" Hundred ")
        num %= 100
    }
    if num >= 20 {
        sb.WriteString(tens[num/10])
        sb.WriteString(" ")
        num %= 10
    }
    if num > 0 {
        sb.WriteString(lessThan20[num])
        sb.WriteString(" ")
    }

    return sb.String()
}

相似题目

题目 难度 考察点
12. 整数转罗马数字 中等 字符串映射
13. 罗马数字转整数 简单 字符串映射
8. 字符串转换整数 (atoi) 中等 字符串解析
65. 有效数字 困难 字符串解析
273. 整数转换英文表示 困难 分段处理
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/38664061
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!