LeetCode273. 整数转换英文表示
将非负整数 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
题解:
这道题我的整体思路就是首先定义一个Map集合来存储需要的数字以及其对应的英文,然后我们以三个数为一组进行分割(从后往前),然后对这三个数组成的一组进行英文的转换,并将其结果保存在一个List集合中,最后,可能会出现三个数不满的情况,我们在对其进行单独的处理,最后将List集合中的字符串进行再拼接,得到最后的结果集。
我们以示例4举例,思路过程如下所示:
代码实现:
public class LeetCode273 {
public static void main(String[] args) {
System.out.println(new LeetCode273().numberToWords(1000000));
}
//定义一个辅助的map以及对应百,千,百万,10亿的单位变量
Map<Integer,String> map = new HashMap<>();
String hundred = "Hundred";
String billion = "Billion";
String million = "Million";
String thousand = "Thousand";
public String numberToWords(int num) {
//如果num为0,则直接返回结果
if(num == 0) {
return "Zero";
}
//map存储值
map.put(1,"One");map.put(2,"Two");map.put(3,"Three");map.put(4,"Four");map.put(5,"Five");map.put(6,"Six");map.put(7,"Seven");map.put(8,"Eight");map.put(9,"Nine");map.put(10,"Ten");
map.put(11,"Eleven");map.put(12,"Twelve");map.put(13,"Thirteen");map.put(14,"Fourteen");map.put(15,"Fifteen");map.put(16,"Sixteen");map.put(17,"Seventeen");map.put(18,"Eighteen");map.put(19,"Nineteen");
map.put(20,"Twenty");map.put(30,"Thirty");map.put(40,"Forty");map.put(50,"Fifty");map.put(60,"Sixty");map.put(70,"Seventy");map.put(80,"Eighty");map.put(90,"Ninety");
//list存储最后的的结果
List<String> list = new ArrayList<>();
int index = 0;
//每三数为一组,用sum记录每三个数所组成的和
int sum = 0;
int pow = 1;
while(num > 0) {
sum = (num % 10) * pow + sum;
num = num / 10;
pow = pow * 10;
++index;
//存储第1位到第3位的三个数组成的和: 单位无
if (index == 3) {
String val = find(sum);
list.add(val);
//重置sum和pow的值
sum = 0;
pow = 1;
}
//存储第4位到第6位的三个数组成的和: 单位为Thousand
if (index == 6) {
String val = find(sum);
if (!val.equals("")) {
list.add(val + " " + thousand + " ");
}
//重置sum和pow的值
sum = 0;
pow = 1;
}
//存储第7位到第9位的三个数组成的和: 单位为Million
if (index == 9) {
String val = find(sum);
if (!val.equals("")) {
list.add(val + " " + million + " ");
}
//重置sum和pow的值
sum = 0;
pow = 1;
}
}
//退出while循环,如果此时sum不为0,则说明不满百位,我们根据此时index的值的范围存储最后应该是哪个范围的值
if (sum != 0) {
if(index < 3) {
String val = findSub(sum);
list.add(val);
}else if(index < 6) {
String val = findSub(sum) + " " + thousand + " ";
list.add(val);
}else if (index < 9) {
String val = findSub(sum) + " " + million + " ";
list.add(val);
}else {
String val = map.get(sum) + " " + billion + " ";
list.add(val);
}
}
//最后进行结果集的拼接...
StringBuilder res = new StringBuilder();
for (int i = list.size() - 1; i >= 0; i--) {
res.append(list.get(i));
}
return res.toString().trim();
}
//找到不足百位对应的英文
private String findSub(int sum) {
//如果此时sum是map中已经存在的key,则直接返回其对应的value值
if (sum <= 20 || sum % 10 == 0) {
return map.get(sum);
}
//否则我们依次取出其十位和个位,进行对应的英文的求解
StringBuilder sb = new StringBuilder();
int sw = sum / 10 * 10; //取整的十位
int gw = sum - sw; //个位数
if (sw > 0) {
sb.append(map.get(sw));
}
if (gw > 0) {
sb.append(" ").append(map.get(gw));
}
return sb.toString().trim();
}
//找到足百位对应的英文
private String find(int sum) {
StringBuilder sb = new StringBuilder();
int b = sum / 100 * 100; //取整的百位数,例如123,则为100
int bw = sum / 100; //百位对应的数字,例如123,则为1
int sw = sum - b; //剩余的十位数字,例如123,则为23
if (sw <= 20 || sw % 10 == 0) {
if (bw > 0) {
sb.append(map.get(bw)).append(" ").append(hundred);
}
if (sw > 0) {
sb.append(" ").append(map.get(sw));
}
}else {
int s = sw / 10 * 10; //取整的十位数
int gw = sw - s; //个位数
if (bw > 0) {
sb.append(map.get(bw)).append(" ").append(hundred);
}
if (s > 0) {
sb.append(" ").append(map.get(s));
}
if (gw > 0) {
sb.append(" ").append(map.get(gw));
}
}
//因为我们的前后可能多添加了空格,这里我们统一使用trim()去除多余的空格
return sb.toString().trim();
}
}