题目:

将非负整数 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. 后端基础PHP—正则表达

    后端基础PHP-正则表达式 1.正则表达式的介绍 2.正则表达式的语法 一.正则表达式的介绍 正则表达式的介绍 · 正则表达式,又称规则表达式,通过一种特殊的语言来挑选符合条件的数据 · 在代码中简写 ...

  2. Morris遍历:常数空间遍历二叉树

    Morris遍历 cur有左树且第一次遍历到,去左孩子 没左树或者第二次遍历到,去右孩子 没右树,去后继节点 得到Morris序.对于该序列中出现两次的节点,只保留第一次遍历,结果就是先序遍历.只保留 ...

  3. 《Go程序设计语言》学习笔记之函数变量和匿名函数

    <Go程序设计语言>学习笔记之函数变量和匿名函数 一. 环境 Centos8.5, go1.17.5 linux/amd64 二. 函数变量 1. 概念 像其它的值一样,函数变量也有类型, ...

  4. 基于pytorch的图像训练识别

    一.准备数据集 分为测试集和训练集,文件如下排放 二.开始识别 数据集准备好后,即可导入到模型开始训练,运行下列代码 import time from torch.utils.tensorboard ...

  5. nodejs下载 安装 配置环境

    1.下载 下载地址:https://nodejs.org/en/download/ 下载完成后,双击安装包,开始安装,一直点next即可.我把安装路径设置为 D:\Program Files\node ...

  6. 4 PyExecJS模块

    PyExecJS模块 pyexecjs是一个可以帮助我们运行js代码的一个第三方模块. 其使用是非常容易上手的. 但是它的运行是要依赖能运行js的第三方环境的. 这里我们选择用node作为我们运行js ...

  7. #单位根反演,二项式定理#LOJ 6247 九个太阳

    题目 \[\large {\sum_{i=0}^n[k|i]C(n,i)}\pmod {998244353} \] 其中\(n\leq 10^{18}\),\(k=2^p,p\in [0,20]\) ...

  8. #树状数组,哈希#洛谷 6687 论如何玩转 Excel 表格

    题目 分析 首先一列的数不会发生变化,只是交换列, 并且交换列的时候奇数列变成偶数列取反, 偶数列变成奇数列取反,考虑直接将偶数列全部取反, 那只需要交换列就可以了,奇数列交换到偶数列会取反, 奇数列 ...

  9. 使用OHOS SDK构建cityhash

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone https://github.com/google/cityhash.git 从v ...

  10. 驾驭数据的能力,如同使用ChatGPT一样,是现代职场人的必修课

    现代职场所比拼的除了聪明才智.过往经验之外,很多软性技能也尤为重要. 现在已经不是像网络游戏开局拿着一根小木棍打天下的时代了,这将是一场武装到牙齿的较量,对于各类"装备"的驾驭能力 ...