题目:

将非负整数 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. 微信自动信息发送助手WMR

    某信自动信息发送助手WMR 最近放假闲来无事,捣鼓了一下pyqt5,正好手上有每天定时大量群发消息的需求,正好就用pyqt5做个小应用练练手. 包含到的主要库:pyqt5.pyperclip.pyau ...

  2. 【开源库推荐】#5 Android高亮引导库

    原文:[开源库推荐]#5 Android高亮引导库 - Stars-One的杂货小窝 本文介绍2个高亮引导库HighLightPro和Curtain hyy920109/HighLightPro: A ...

  3. Python爬虫实战系列3:今日BBNews编程新闻采集

    一.分析页面 打开今日BBNews网址 https://news.bicido.com ,下拉选择[编程]栏目 1.1.分析请求 F12打开开发者模式,然后点击Network后点击任意一个请求,Ctr ...

  4. 关于Android studio无法勾选SDK的问题

    这是我遇到的问题,相信也是大多数人遇到的问题,我的经历是之前下载过一次Android studio,用过一段时间后虚拟机出问题了,一直连不上,我都是用手机代替运行,发现太麻烦了,还是决定重新一遍,于是 ...

  5. dynatrace统计sql执行时间要考虑网络延时

    对一个系统的功能环境做压测,响应时间特别慢,开发环境却很快. 原因是,开发的应用服务器在北方,功能的应用服务器在南方,数据库服务器共用一个,在北方. 北方的应用调北方的数据库,响应时间2s,互相pin ...

  6. 嵌入式C语言设计学习之C语言回顾

    C的基本语法-回忆 1.C的结构 C语言的结构还是以函数为主体,通过其他资源的添加来实现高级语言逻辑.所有的操作都是基于主函数展开的.以主函数为顺序列表,其他函数作为功能模块,组成一个完整的系统.所以 ...

  7. GIT:斯坦福大学提出应对复杂变换的不变性提升方法 | ICLR 2022

    论文对长尾数据集中的复杂变换不变性进行了研究,发现不变性在很大程度上取决于类别的图片数量,实际上分类器并不能将从大类中学习到的不变性转移到小类中.为此,论文提出了GIT生成模型,从数据集中学习到类无关 ...

  8. KingbaseES V8R6备份恢复案例之---sys_restore实现schema转换

    **案例说明:** sys_restore用于sys_dump备份的数据恢复,在实际的应用中有需求,将从sys_dump备份对象从原schema中转换到到另外的schema,sys_restore支持 ...

  9. Makefile 简单学习

    一.Makefile 简介 Makefile 是一种常用于编译的脚本语言.它可以更好更方便的管理你的项目的代码编译,节约编译时间(没改动的文件不编译).注意 Makefile 文件命令必须是 Make ...

  10. C++设计模式 - 建造者模式(Builder)

    对象创建模式 通过"对象创建" 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fac ...