forked from jyxia/LeetCode-JavaScript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path273-integerToEnglish.js
129 lines (105 loc) · 3.11 KB
/
273-integerToEnglish.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/**
* @param {number} num
* @return {string}
*/
// my own solution
var numberToWords = function(num) {
var dict = { 1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five',
6: 'Six', 7: 'Seven', 8: 'Eight', 9: 'Nine', 10: 'Ten',
11: 'Eleven', 12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen',
15: 'Fifteen', 16: 'Sixteen', 17: 'Seventeen', 18: 'Eighteen',
19: 'Nineteen', 20: 'Twenty', 30: 'Thirty', 40: 'Forty',
50: 'Fifty', 60: 'Sixty', 70: 'Seventy', 80: 'Eighty',
90: 'Ninety'};
var str = '';
if (num === 0) {
return 'Zero';
}
for (var i = 9; i >= 0;) {
var most = Math.floor(num / Math.pow(10, i));
num = num % Math.pow(10, i);
if (i === 9 && most > 0) {
str += dict[most] + ' Billion ';
}
if (i === 6 && most > 0) {
str += threeDigits(most, dict) + ' Million ';
}
if (i === 3 && most > 0) {
str += threeDigits(most, dict) + ' Thousand ';
}
if (i === 0 && most > 0) {
str += threeDigits(most, dict);
}
if (num === 0) {
str = str.trim();
break;
}
i -= 3;
}
return str;
};
var threeDigits = function(num, dict) {
var hundred = 0;
var rem = 0;
var str = '';
if (num === 0) {
return '';
} else if (num < 100) {
str = twoDigits(num, dict);
} else {
hundred = Math.floor(num / 100);
str = dict[hundred] + ' Hundred';
rem = num % 100;
if (rem <= 10 && rem > 0) {
str += ' ' + dict[rem];
} else if (rem > 10) {
str += ' ' + twoDigits(rem, dict);
}
}
return str;
};
var twoDigits = function twoDigits(num, dict) {
var str = '';
var least = Math.floor(num % 10);
var most = num - least;
if (least === 0 || num <= 20) {
str += dict[num];
} else {
str += dict[most] + ' ' + dict[least];
}
return str;
}
// a more concise way
var zeroToTwenty = ['', 'One', 'Two', 'Three', 'Four', 'Five',
'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve',
'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen',
'Eighteen', 'Nineteen', 'Twenty'];
var twentyToNinety = ['', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'];
var thousand = ['', 'Thousand', 'Million', 'Billion'];
var numberToWords = function(num) {
var str = '';
if (num === 0) {
return 'Zero';
}
for (var i = 0; num > 0; i++) {
var h = num % 1000;
if (h > 0) { // in case 1,000,000
str = helper(h) + thousand[i] + ' ' + str;
}
num = Math.floor(num / 1000);
}
return str.trim();
};
function helper(num) {
if (num === 0) {
return '';
} else if (num <= 20) {
return zeroToTwenty[num] + ' ';
} else if (num < 100) {
var h = Math.floor(num / 10);
return twentyToNinety[h - 1] + ' ' + helper(num % 10);
} else {
var h = Math.floor(num / 100);
return zeroToTwenty[h] + ' Hundred ' + helper(num % 100);
}
}