题目:

将非负整数 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"

提示:

0 <= num <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/integer-to-english-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

一、递归

将整数转换成英文表示,三个数值为一组,使用递归的方式将每一组用英文表示,并添加上每一组对应的单位词后拼接即可,每一组的处理方式如下:

  • 处理特殊数字0,返回空(如果原数为0,直接返回"Zero");
  • 小于20的数,直接用对应的英文表示即可;
  • [ 20,100) 之间的数将十位转换成英文表示,对个位递归转换成英文表示;
  • 大于等于100的数,将百位转换成英文表示,对十位个位进行递归转换成英文表示。

代码:

 1 class Solution {
2 String[] oneToTwenty = {"", "One ", "Two ", "Three ", "Four ", "Five ", "Six ", "Seven ", "Eight ", "Nine ","Ten ",
3 "Eleven ", "Twelve ", "Thirteen ", "Fourteen ", "Fifteen ", "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen ", "Twenty "};
4 String[] tens = {"", "Ten ", "Twenty ", "Thirty ", "Forty ", "Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety "};
5 String[] thousands = {"", "Thousand ", "Million ", "Billion "};//"",千,百万,十亿
6
7 public String numberToWords(int num) {
8 //处理0
9 if(num == 0) return "Zero";
10 //处理小于1000的数
11 if(num < 1000) return thousandsLow(num).trim();
12
13 StringBuilder sb = new StringBuilder();
14 int index = 0;
15 while(num > 0){
16 //每三位截取为一段
17 if(num % 1000 != 0)
18 //插入到开头的位置,第一次取的是最后三位数
19 sb.insert(0,thousandsLow(num % 1000) + thousands[index]);
20 num = num / 1000;
21 index++;
22 }
23 return sb.toString().trim();
24 }
25 //一千以下的单独处理
26 public String thousandsLow(int num){
27 if(num == 0) return "";
28 //小于20直接返回对应的数字
29 if(num < 20) return oneToTwenty[num];
30 //20-100
31 else if(num < 100) return tens[num / 10] + thousandsLow(num % 10);
32 //100-1000
33 else return oneToTwenty[num / 100] + "Hundred "+ thousandsLow(num % 100);
34 }
35 }

 二、迭代

分情况讨论每一段:[1,20]、[21,99]、[100, 999]

  • [1,20]直接转为对应的单词;
  • [21,99],先取十位,再将个位按[1,20]转为对应的单词;
  • [100,999],先取百位再加上单位,剩下的十位和个位按照[1,20]和[21,99]转为对应的单词。

代码:

 1 class Solution {
2 public static String[] oneToTwenty = {"", "One ", "Two ", "Three ", "Four ", "Five ", "Six ", "Seven ", "Eight ", "Nine ","Ten ", "Eleven ", "Twelve ", "Thirteen ", "Fourteen ", "Fifteen ", "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen ", "Twenty "};
3 public static String[] tens = {"", "Ten ", "Twenty ", "Thirty ", "Forty ", "Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety "};
4 public static String[] thousands = {"Billion ", "Million ", "Thousand ", ""};//"",千,百万,十亿
5 public static int[] mod = {1000000000, 1000000, 1000, 1};
6
7 public String numberToWords(int n) {
8 //处理0
9 if(n == 0) return "Zero";
10
11 StringBuilder sb = new StringBuilder();
12 int i = 0;
13 while(n > 0){
14 //每三位截取为一段
15 int x = n / mod[i];
16 if(x > 0){
17 toWordsFor1To999(sb, x);
18 //加上单位
19 sb.append(thousands[i]);
20 }
21 n = n % mod[i];
22 i++;
23 }
24 return sb.toString().trim();
25 }
26 //1-20转成单词加入到sb中
27 public static void toWordsFor1To20(StringBuilder sb, int n){
28 sb.append(oneToTwenty[n]);
29 }
30 //21-99转成单词加入到sb中
31 public static void toWordsFor21To99(StringBuilder sb, int n){
32 //取十位
33 int num = n / 10;
34 sb.append(tens[num]);
35 //取个位
36 int x = n % 10;
37 if(x > 0) toWordsFor1To20(sb, x);
38 }
39 //100-999转换成单词加入到sb中
40 public static void toWordsFor100To999(StringBuilder sb, int n){
41 //取百位
42 int x = n / 100;
43 toWordsFor1To20(sb, x);
44 //加上百的单位
45 sb.append("Hundred ");
46 int y = n % 100;
47 if(y > 20) toWordsFor21To99(sb, y);
48 else if(y > 0) toWordsFor1To20(sb, y);
49 }
50 //1-999
51 public static void toWordsFor1To999(StringBuilder sb, int n){
52 if(n >= 0 && n <= 20){
53 toWordsFor1To20(sb, n);
54 }else if(n > 20 && n < 100){
55 toWordsFor21To99(sb, n);
56 }else{
57 toWordsFor100To999(sb, n);
58 }
59 }
60 }

小知识:

trim() 方法用于删除字符串的头尾空白符

力扣273(java)-整数转换英文表示(困难)的更多相关文章

  1. Java实现 LeetCode 273 整数转换英文表示

    273. 整数转换英文表示 将非负整数转换为其对应的英文表示.可以保证给定输入小于 231 - 1 . 示例 1: 输入: 123 输出: "One Hundred Twenty Three ...

  2. Leetcode 273.整数转换英文表示

    整数转换英文表示 将非负整数转换为其对应的英文表示.可以保证给定输入小于 231 - 1 . 示例 1: 输入: 123 输出: "One Hundred Twenty Three" ...

  3. 273 Integer to English Words 整数转换英文表示

    将非负整数转换为其对应的英文表示,给定的输入是保证小于 231 - 1 的.示例:123 -> "One Hundred Twenty Three"12345 -> & ...

  4. [Swift]LeetCode273. 整数转换英文表示 | Integer to English Words

    Convert a non-negative integer to its english words representation. Given input is guaranteed to be ...

  5. 将整数转换成二进制的java小程序

    首先我们知道,将整数转换成二进制是将整数除二取余将最后除得的数和得到的余数从下向上写,组成得到的二进制数. java程序实现如下: public class ChangeToErjinzhi { pu ...

  6. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  7. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

  8. 力扣 ——Linked List Cycle II(环形链表 II) python实现

    题目描述: 中文: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). ...

  9. 力扣——Linked List Cycle(环形链表) python实现

    题目描述: 中文: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...

  10. 力扣——Reverse Nodes in k-Group(K 个一组翻转链表) python实现

    题目描述: 中文: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序 ...

随机推荐

  1. 对象遍历 Object.keys(obj).forEach(name=> {})

    Object.keys(props).forEach(name => { watch[name] = function (value) { this.columnConfig.update(na ...

  2. Shell脚本自动下载FTP文件上传到S3

    1. shell脚本下载 #!/bin/bash #用户名 USER=xxx #密码 PASSWORD=xxx #下载文件临时目录 SRCTDIR=/approveform/uat/tempin #S ...

  3. 自己想到的几道Java面试题

    1.在抽象类中能否写main方法,为什么? 2.在接口中能否写main方法,为什么? 3.Java能否使用静态局部变量,为什么? 4.Java类变量,实例变量,局部变量在多线程环境下是否线程安全,为什 ...

  4. Android13源码下载环境搭建

    由于AOSP的下载&编译等工作,需要用到git与python的支持,所以需要提前安 装好 VMware解决Ubuntu不占满全屏问题和Windows复制粘贴问题 https://blog.cs ...

  5. CAST电子部单片机方向授课——串口通信 预习文档

    CAST电子部单片机方向授课--串口通信 预习文档 课前小准备 安装串口调试助手 第一步:进入Microsoft Store 第二步:在Microsoft Store中搜索 "串口调试助手& ...

  6. .Net依赖注入神器Scrutor(上)

    前言 从.Net Core 开始,.Net 平台内置了一个轻量,易用的 IOC 的框架,供我们在应用程序中使用,社区内还有很多强大的第三方的依赖注入框架如: Autofac DryIOC Grace ...

  7. Java问题汇总,持续更新到GitHub

    目录介绍 00.Java问题汇总 01.具体问题 好消息 博客笔记大汇总[16年3月到至今],包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bu ...

  8. 记录转载:uni-app 请求 uni.request封装使用

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 对uni.request的一些共同参数进行简单的封装,减少重复性数据请求代码.方便全局调用. 先在目录下创建 utils 和 common ...

  9. java通过jsch使用sftp连接linux处理文件

    1.Maven依赖 <!--Java连接Linux服务器依赖--> <dependency> <groupId>com.jcraft</groupId> ...

  10. QT 自定义插件问题 error: LNK2001: 无法解析的外部符号

    为了重复利用已有的代码,我使用自定义插件进行开发.当每个插件独立开发时没有遇到问题,但是当插件B引用了插件A时就会在编译时报错 error: LNK2001: 无法解析的外部符号. 例如,先定义一个插 ...