题目:

将非负整数 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. 2.String类能被继承吗

    2.String类能被继承吗 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的. 拓展 String的底层是一个用private和final修饰的char数组.fina ...

  2. JS(简单数据类型、数据类型转换)

    一. 数据类型简介 1.1 为什么需要数据类型 在计算机中,不同的数据所需占用的存储空间是不同的,为了便于把数据分成所需内存大小不同的数据,充分利用存储空间,于是定义了不同的数据类型.简单来说,数据类 ...

  3. python高级技术(线程)

    一 线程理论 1 有了进程为什么要有线程 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率.很多人就不理解了,既然进程这么优秀,为什么还要线程 ...

  4. ARouter路由解析

    目录介绍 01.原生跳转实现 02.实现组件跳转方式 2.1 传统跳转方式 2.2 为何需要路由 03.ARouter配置与优势 04.跨进程组件通信 4.1 URLScheme 4.2 AIDL 4 ...

  5. 借助Numpy,优化Pandas的条件检索代码

    Numpy其实是最早的处理数据的Python库,它的核心ndarray对象,是一个高效的n维数组结构. 通过这个库,可以高效的完成向量和矩阵运算,由于其出色的性能,很多其他的数据分析,科学计算或者机器 ...

  6. Excel多列求平均值

    数据源如下所示 需求描述:现在需要根据水果名称和月份求出对应水果的平均单价 一.添加一列辅助列(=A2&B2) 二.Ctrl+A选择所有数据插入数据透视表,选择辅助列到行,客单价到值(值字段设 ...

  7. 创建远程仓库&克隆项目(Github)

    创建远程仓库 在GitHub上注册一个账号,之后creat a new repository 创建的远程仓库把它看作一个百度网盘就可以了 克隆项目 1.远程仓库可以下载\克隆到本地 code :git ...

  8. HDFS Short-Circuit Local Reads

    目录 1.背景 2.配置 2.1 检测是否启用libhadoop.so 2.2 设置套接字路径 2.3 配置示例 2.4.1 /var/lib/hadoop-hdfs目录未创建 2.4.2 创建 /v ...

  9. rabbitmq学习记录

    一.RabbitMQ的概念 RabbitMQ 是一个消息中间件:它接受并转发消息.你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这 ...

  10. 理解持续测试,才算理解DevOps

    软件产品的成功与否,在很大程度上取决于对市场需求的及时把控,采用DevOps可以加快产品交付速度,改善用户体验,从而有助于保持领先于竞争对手的优势. 作为敏捷开发方法论的一种扩展,DevOps强调开发 ...