Skip to content

Commit 0445042

Browse files
authored
feat: add solutions for lc No.0273 (#4994)
1 parent 8551aeb commit 0445042

9 files changed

Lines changed: 963 additions & 595 deletions

File tree

solution/0200-0299/0273.Integer to English Words/README.md

Lines changed: 319 additions & 198 deletions
Large diffs are not rendered by default.

solution/0200-0299/0273.Integer to English Words/README_EN.md

Lines changed: 319 additions & 198 deletions
Large diffs are not rendered by default.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
class Solution {
2+
public:
3+
vector<string> lt20 = {
4+
"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight",
5+
"Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen",
6+
"Sixteen", "Seventeen", "Eighteen", "Nineteen"};
7+
8+
vector<string> tens = {
9+
"", "Ten", "Twenty", "Thirty", "Forty", "Fifty",
10+
"Sixty", "Seventy", "Eighty", "Ninety"};
11+
12+
vector<string> thousands = {"Billion", "Million", "Thousand", ""};
13+
14+
string numberToWords(int num) {
15+
if (num == 0) {
16+
return "Zero";
17+
}
18+
string res;
19+
for (int i = 1000000000, j = 0; i > 0; i /= 1000, ++j) {
20+
int cur = num / i;
21+
if (cur == 0) {
22+
continue;
23+
}
24+
if (!res.empty()) {
25+
res += ' ';
26+
}
27+
res += transfer(cur);
28+
if (!thousands[j].empty()) {
29+
res += ' ';
30+
res += thousands[j];
31+
}
32+
num %= i;
33+
}
34+
return res;
35+
}
36+
37+
private:
38+
string transfer(int num) {
39+
if (num == 0) {
40+
return "";
41+
}
42+
if (num < 20) {
43+
return lt20[num];
44+
}
45+
if (num < 100) {
46+
if (num % 10 == 0) {
47+
return tens[num / 10];
48+
}
49+
return tens[num / 10] + " " + transfer(num % 10);
50+
}
51+
if (num % 100 == 0) {
52+
return lt20[num / 100] + " Hundred";
53+
}
54+
return lt20[num / 100] + " Hundred " + transfer(num % 100);
55+
}
56+
};
Lines changed: 42 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,56 @@
1-
using System.Collections.Generic;
2-
using System.Linq;
3-
41
public class Solution {
5-
private string[] bases = { "Thousand", "Million", "Billion" };
2+
private readonly string[] lt20 = {
3+
"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight",
4+
"Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen",
5+
"Sixteen", "Seventeen", "Eighteen", "Nineteen"
6+
};
7+
8+
private readonly string[] tens = {
9+
"", "Ten", "Twenty", "Thirty", "Forty", "Fifty",
10+
"Sixty", "Seventy", "Eighty", "Ninety"
11+
};
12+
13+
private readonly string[] thousands = { "Billion", "Million", "Thousand", "" };
14+
615
public string NumberToWords(int num) {
7-
if (num == 0)
8-
{
16+
if (num == 0) {
917
return "Zero";
1018
}
11-
var baseIndex = -1;
12-
var parts = new List<string>();
13-
while (num > 0)
14-
{
15-
var part = NumberToWordsInternal(num % 1000);
16-
if (part.Length > 0 && baseIndex >= 0)
17-
{
18-
part = JoinParts(part, bases[baseIndex]);
19+
20+
string res = "";
21+
for (int i = 1000000000, j = 0; i > 0; i /= 1000, ++j) {
22+
int cur = num / i;
23+
if (cur == 0) {
24+
continue;
25+
}
26+
if (res.Length > 0) {
27+
res += " ";
28+
}
29+
res += Transfer(cur);
30+
if (thousands[j].Length > 0) {
31+
res += " " + thousands[j];
1932
}
20-
parts.Add(part);
21-
baseIndex++;
22-
num /= 1000;
33+
num %= i;
2334
}
24-
parts.Reverse();
25-
return JoinParts(parts);
35+
return res;
2636
}
2737

28-
private string JoinParts(IEnumerable<string> parts)
29-
{
30-
return string.Join(" ", parts.Where(p => p.Length > 0));
31-
}
32-
33-
private string JoinParts(params string[] parts)
34-
{
35-
return JoinParts((IEnumerable<string>)parts);
36-
}
37-
38-
private string NumberToWordsInternal(int num)
39-
{
40-
switch(num)
41-
{
42-
case 0: return "";
43-
case 1: return "One";
44-
case 2: return "Two";
45-
case 3: return "Three";
46-
case 4: return "Four";
47-
case 5: return "Five";
48-
case 6: return "Six";
49-
case 7: return "Seven";
50-
case 8: return "Eight";
51-
case 9: return "Nine";
52-
case 10: return "Ten";
53-
case 11: return "Eleven";
54-
case 12: return "Twelve";
55-
case 13: return "Thirteen";
56-
case 14: return "Fourteen";
57-
case 15: return "Fifteen";
58-
case 16: return "Sixteen";
59-
case 17: return "Seventeen";
60-
case 18: return "Eighteen";
61-
case 19: return "Nineteen";
38+
private string Transfer(int num) {
39+
if (num == 0) {
40+
return "";
6241
}
63-
64-
if (num < 100)
65-
{
66-
string part1;
67-
switch (num/10)
68-
{
69-
case 2: part1 = "Twenty"; break;
70-
case 3: part1 = "Thirty"; break;
71-
case 4: part1 = "Forty"; break;
72-
case 5: part1 = "Fifty"; break;
73-
case 6: part1 = "Sixty"; break;
74-
case 7: part1 = "Seventy"; break;
75-
case 8: part1 = "Eighty"; break;
76-
case 9: default: part1 = "Ninety"; break;
42+
if (num < 20) {
43+
return lt20[num];
44+
}
45+
if (num < 100) {
46+
if (num % 10 == 0) {
47+
return tens[num / 10];
7748
}
78-
var part2 = NumberToWordsInternal(num % 10);
79-
return JoinParts(part1, part2);
49+
return tens[num / 10] + " " + Transfer(num % 10);
8050
}
81-
82-
{
83-
var part1 = NumberToWordsInternal(num / 100);
84-
var part2 = NumberToWordsInternal(num % 100);
85-
return JoinParts(part1, "Hundred", part2);
51+
if (num % 100 == 0) {
52+
return lt20[num / 100] + " Hundred";
8653
}
54+
return lt20[num / 100] + " Hundred " + Transfer(num % 100);
8755
}
8856
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
func numberToWords(num int) string {
2+
if num == 0 {
3+
return "Zero"
4+
}
5+
6+
lt20 := []string{
7+
"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight",
8+
"Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen",
9+
"Sixteen", "Seventeen", "Eighteen", "Nineteen",
10+
}
11+
tens := []string{
12+
"", "Ten", "Twenty", "Thirty", "Forty", "Fifty",
13+
"Sixty", "Seventy", "Eighty", "Ninety",
14+
}
15+
thousands := []string{"Billion", "Million", "Thousand", ""}
16+
17+
var transfer func(int) string
18+
transfer = func(num int) string {
19+
if num == 0 {
20+
return ""
21+
}
22+
if num < 20 {
23+
return lt20[num]
24+
}
25+
if num < 100 {
26+
if num%10 == 0 {
27+
return tens[num/10]
28+
}
29+
return tens[num/10] + " " + transfer(num%10)
30+
}
31+
if num%100 == 0 {
32+
return lt20[num/100] + " Hundred"
33+
}
34+
return lt20[num/100] + " Hundred " + transfer(num%100)
35+
}
36+
37+
res := ""
38+
for i, j := 1000000000, 0; i > 0; i, j = i/1000, j+1 {
39+
cur := num / i
40+
if cur == 0 {
41+
continue
42+
}
43+
if res != "" {
44+
res += " "
45+
}
46+
res += transfer(cur)
47+
if thousands[j] != "" {
48+
res += " " + thousands[j]
49+
}
50+
num %= i
51+
}
52+
return res
53+
}
Lines changed: 22 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,36 @@
11
class Solution {
2-
private static Map<Integer, String> map;
3-
4-
static {
5-
map = new HashMap<>();
6-
map.put(1, "One");
7-
map.put(2, "Two");
8-
map.put(3, "Three");
9-
map.put(4, "Four");
10-
map.put(5, "Five");
11-
map.put(6, "Six");
12-
map.put(7, "Seven");
13-
map.put(8, "Eight");
14-
map.put(9, "Nine");
15-
map.put(10, "Ten");
16-
map.put(11, "Eleven");
17-
map.put(12, "Twelve");
18-
map.put(13, "Thirteen");
19-
map.put(14, "Fourteen");
20-
map.put(15, "Fifteen");
21-
map.put(16, "Sixteen");
22-
map.put(17, "Seventeen");
23-
map.put(18, "Eighteen");
24-
map.put(19, "Nineteen");
25-
map.put(20, "Twenty");
26-
map.put(30, "Thirty");
27-
map.put(40, "Forty");
28-
map.put(50, "Fifty");
29-
map.put(60, "Sixty");
30-
map.put(70, "Seventy");
31-
map.put(80, "Eighty");
32-
map.put(90, "Ninety");
33-
map.put(100, "Hundred");
34-
map.put(1000, "Thousand");
35-
map.put(1000000, "Million");
36-
map.put(1000000000, "Billion");
37-
}
2+
private String[] lt20 = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight",
3+
"Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen",
4+
"Seventeen", "Eighteen", "Nineteen"};
5+
private String[] tens
6+
= {"", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
7+
private String[] thousands = {"Billion", "Million", "Thousand", ""};
388

399
public String numberToWords(int num) {
4010
if (num == 0) {
4111
return "Zero";
4212
}
4313
StringBuilder sb = new StringBuilder();
44-
for (int i = 1000000000; i >= 1000; i /= 1000) {
45-
if (num >= i) {
46-
sb.append(get3Digits(num / i)).append(' ').append(map.get(i));
47-
num %= i;
14+
for (int i = 1000000000, j = 0; i > 0; i /= 1000, ++j) {
15+
if (num / i == 0) {
16+
continue;
4817
}
18+
sb.append(transfer(num / i)).append(thousands[j]).append(' ');
19+
num %= i;
4920
}
50-
if (num > 0) {
51-
sb.append(get3Digits(num));
52-
}
53-
return sb.substring(1);
21+
return sb.toString().trim();
5422
}
5523

56-
private String get3Digits(int num) {
57-
StringBuilder sb = new StringBuilder();
58-
if (num >= 100) {
59-
sb.append(' ').append(map.get(num / 100)).append(' ').append(map.get(100));
60-
num %= 100;
24+
private String transfer(int num) {
25+
if (num == 0) {
26+
return "";
6127
}
62-
if (num > 0) {
63-
if (num < 20 || num % 10 == 0) {
64-
sb.append(' ').append(map.get(num));
65-
} else {
66-
sb.append(' ').append(map.get(num / 10 * 10)).append(' ').append(map.get(num % 10));
67-
}
28+
if (num < 20) {
29+
return lt20[num] + " ";
30+
}
31+
if (num < 100) {
32+
return tens[num / 10] + " " + transfer(num % 10);
6833
}
69-
return sb.toString();
34+
return lt20[num / 100] + " Hundred " + transfer(num % 100);
7035
}
71-
}
36+
}

0 commit comments

Comments
 (0)