【Leetcode】273. Integer to English Words
阿新 • • 發佈:2021-02-03
技術標籤:LC 棧、佇列、串及其他資料結構leetcode字串演算法
題目地址:
https://leetcode.com/problems/integer-to-english-words/
將一個十進位制 32 32 32位非負整數轉為其英語表達。
先開個函式專門求一下一個 1 ∼ 999 1\sim 999 1∼999的英文表達,然後對原數拆解為多少個billion,多少個million和多少個thousand,最後拼接起來。程式碼如下:
public class Solution {
private String[] n0_19 = {
"Zero" , "One", "Two", "Three", "Four",
"Five", "Six", "Seven", "Eight", "Nine",
"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen",
"Fifteen" , "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
private String[] n20_90 = {
"Twenty", "Thirty", "Forty", "Fifty", "Sixty",
"Seventy", "Eighty", "Ninety" };
private String[] n1000 = {" Billion ", " Million ", " Thousand ", ""};
public String numberToWords(int num) {
if (num == 0) {
return "Zero";
}
StringBuilder sb = new StringBuilder();
for (int i = (int) 1e9, j = 0; i >= 1; i /= 1000, j++) {
if (num >= i) {
sb.append(get(num / i)).append(n1000[j]);
num %= i;
}
}
if (sb.charAt(sb.length() - 1) == ' ') {
sb.setLength(sb.length() - 1);
}
return sb.toString();
}
// 得到1~999的英文表示
private String get(int x) {
StringBuilder sb = new StringBuilder();
if (x >= 100) {
sb.append(n0_19[x / 100]).append(" Hundred ");
x %= 100;
}
if (x >= 20) {
sb.append(n20_90[x / 10 - 2]).append(' ');
x %= 10;
if (x != 0) {
sb.append(n0_19[x]);
}
} else if (x > 0) {
// 如果是0的話是不要將“Zero”拼在後面的
sb.append(n0_19[x]);
}
if (sb.charAt(sb.length() - 1) == ' ') {
sb.setLength(sb.length() - 1);
}
return sb.toString();
}
}
時空複雜度 O ( 1 ) O(1) O(1)。