将非负整数 num
转换为其对应的英文表示。
示例 1:
输入:num = 123 输出:"One Hundred Twenty Three"
示例 2:
输入:num = 12345 输出:"Twelve Thousand Three Hundred Forty Five"
示例 3:
输入:num = 1234567 输出:"One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"
示例 4:
输入:num = 1234567891 输出:"One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One"
提示:
0 <= num <= 231 - 1
今天每日一题
随便写下
一个需要知道的基本知识点,英文和中文中的差别
中文中可以理解为4位一段,
从个到千
从万到千万
从亿到千亿
但是英文中不是这样的,英文中是按照3位一段的计数法,比如例子
1234567891,我们有某些时候看到的表达方式是这样的
1 , 234 , 567 , 891
7 Thousand
4 Million
1 Billion
对于小于3位的部分,就很简单了,就是 X hundred XX这样的结构
那么思路就是这样的了
- 每3位处理一次,这样每次除以1000取余来处理这部分数据,然后再处理除以1000之后取整的数字
- 百位直接按1-9取英文再加Hundred,如果没有百位,则跳过
- 100以下的部分,1-19单独处理,大于等于20的,按照整10部分+个位数部分处理转换
class Solution {
public String numberToWords(int num) {
if (num ==0){
return "Zero";
}
String[] arr1 = new String[]{"","Thousand","Million","Billion"};
String[] arr2 = new String[]{"Hundred"};
String[] arr3 = new String[]{"","One","Two","Three","Four","Five","Six","Seven","Eight","Nine"};
String[] arr4 = new String[]{"Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"};
String[] arr5 = new String[]{"","","Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};
int idx1 = 0;
ArrayList<String> list = new ArrayList<>();
while (num != 0){
int tmp = num % 1000;
num = num / 1000;
int hundred = tmp / 100;
tmp = tmp % 100;
StringBuffer sb2 = new StringBuffer();
if (hundred>0){
// System.out.print(arr3[hundred]+" "+arr2[0]+" ");
sb2.append(arr3[hundred]).append(" ").append(arr2[0]).append(" ");
}
if (tmp>=20){
// System.out.print(arr5[tmp/10] + " " + arr3[tmp%10] + " ");
sb2.append(arr5[tmp/10]).append(" ");
if (tmp%10>0){
sb2.append(arr3[tmp%10]).append(" ");
}
}else if (tmp < 10 && tmp > 0){
// System.out.print(arr3[tmp%10] + " ");
sb2.append(arr3[tmp%10]).append(" ");
}else if (tmp>0){
// System.out.print(arr4[tmp-10] + " ");
sb2.append(arr4[tmp-10]).append(" ");
}
// System.out.println(arr1[idx1]);
if (sb2.length()>0){
sb2.append(arr1[idx1]).append(" ");
}
idx1++;
list.add(0,sb2.toString());
}
StringBuffer sb = new StringBuffer();
for (String s : list) {
// System.out.println(s);
sb.append(s);
}
String a = sb.toString();
while (a.charAt(a.length()-1) == ' '){
a = a.substring(0,a.length()-1);
}
return a;
}
}
拓展小知识来源百度
1至10无规律可循: one、two、three、four、five、six、seven、eight、nine、ten;
11至19 :eleven、twelve、thirteen、fourteen、fifteen、sixteen、seventeen、eighteen、 nineteen;
从20至99:整数的几十中除了twenty(二十)、thirty(三十)、forty(四十)、fifty(五十)、eighty(八十)为特殊形式外,sixty(六十)、seventy(七十)、ninety(九十)都是其个位数形式后添加后缀-ty构成。
百位数个数基数词形式加“hundred”,表示几百,在几十几与百位间加上and。
第四条一般认为是英式表达中会用到,本题中都没有and,一开始做的时候感觉有点怪怪的
另外还有一些其他的细节性的表达,比如2000这种的结尾加only表示整。
发表评论