LeetCode 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. 整数转换英文表示 | 困难 | 分段处理 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!