LeetCode每日一题之LeetCode273"/>
LeetCode每日一题之LeetCode273
LeetCode273. 整数转换英文表示
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位的三个数组成的和: 单位为Thousandif (index == 6) {String val = find(sum);if (!val.equals("")) {list.add(val + " " + thousand + " ");}//重置sum和pow的值sum = 0;pow = 1;}//存储第7位到第9位的三个数组成的和: 单位为Millionif (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,则为100int bw = sum / 100; //百位对应的数字,例如123,则为1int sw = sum - b; //剩余的十位数字,例如123,则为23if (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();}
}
更多推荐
LeetCode每日一题之LeetCode273
发布评论