题目:

将非负整数 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. C#实现软件开机自启动(不需要管理员权限)

    目录 原理简介 使用方法 完整代码 原理简介 本文参考C#/WPF/WinForm/程序实现软件开机自动启动的两种常用方法,将里面中的第一种方法做了封装成AutoStart类,使用时直接两三行代码就可 ...

  2. WPF之资源

    目录 WPF对象资源的定义和查找 动态.静态使用资源 向程序添加二进制资源 字符串资源 非字符串资源 使用Pack URI路径访问二进制资源 WPF不但支持程序级的传统资源,同时还推出了独具特色的对象 ...

  3. python queue模块实例解析

    一 概念: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,是一种操作受限制的线性表. 进行插入操作的端称为队尾,进行 ...

  4. 双声道音频16bit量化16KHz采样率共多少个bit

    Hz(赫兹)是频率单位,其含义是每秒钟的次数.kHz中的k是千的意思,所以kHz就是千赫兹,所以16kHz就是16000Hz,意思就是每秒钟采样16000次.bit(比特)称为"位" ...

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

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

  6. eclipse错误之Errors occurred during the build. Errors running builder 'JavaScript Validator' on project

    把JavaScript Validator去掉.去掉的方法是:选择一个项目--右键Properties--Builders(排第二)--点一下右侧会有四项--取消第一项"JavaScript ...

  7. Wireshark在多媒体开发中的使用

    一 概要: Wireshark(前称Ethereal)是一个网络抓包工具. 是一款非常棒的Unix和Windows上的开源 网络协议分析器.尽可能显示出最为详细的网络封包资料.Wireshark使用W ...

  8. python面向对象(继承)

    一 继承 1.什么是继承1)继承是一种创建新类的方式,新建的类可称为子类或派生类,父类又可称为基类或超类子类会遗传父类的属性2)需要注意的是:python支持多继承 在python中,新建的类可以继承 ...

  9. 探讨三维模型OBJ格式轻量化在数据存储的重要性

    探讨三维模型OBJ格式轻量化在数据存储的重要性 三维模型的OBJ格式轻量化在数据存储方面具有重要性.以下是对三维模型OBJ格式轻量化在数据存储的重要性进行浅析: 1.节省存储空间:原始的三维模型文件往 ...

  10. #环#nssl 1487 图

    题目 在一个\(n\)个节点\(n\)条边的连通图中, 每条边的权值为两个端点的权值的和. 已知各边权值,求各点权值 (保证环的大小一定是奇数) 分析 考虑断掉环的某一条边,设根节点的答案为\(ax+ ...