Problem
Convert a non-negative integer num
to its English words representation.
Example 1:
1 | Input: num = 123 |
Example 2:
1 | Input: num = 12345 |
Example 3:
1 | Input: num = 1234567 |
Example 4:
1 | Input: num = 1234567891 |
Constraints:
0 <= num <= 231 - 1
Analysis
这道题目要求把一个数字转化为英语的文字,是一道和字符串拼接相关的题目。一开始没什么好的突破点,就先直接看看hint了。提示给的信息很明确,分成三位数来做,因为每个三位数都有自己的读法,然后再加上这个三位数所在的位(Thousand、Million和Billion)就是最后正确的读法。比如example2,我们把12345
分为12
和345
,那么对于12
来说,它本身的读法是Twelve,加上所在的位是Thousand,连起来就是Twelve Thousand了。这个突破口找到了,接下来我们来看细节。数字转英文读法最麻烦的就是十位的读法,这里有个规律:小于20的话是有特殊的读法的,而大于等于20则是无脑直接拼凑十位和个位。例如13是Thirteen,而23是Twenty Three。
分析到这里我们就可以动手写了,我们从最低的三位开始处理,通过取余的方法获取最低的三位。假设我们已经处理完最低的三位了,我们接着处理第二个三位,然后每两段之间进行连接,加上当前三位对应的位(Thousand,Million和Billion),最后去除掉最后的空格已经判断是否为空即可。
然后我们再focus回三位数的处理逻辑。我们首先拿到百位的数字a = num / 100
,然后拿到十位和个位的数字b = num % 100
(注意必须是十位和个位一起,用来判断是否超过20),最后还要拿到单独个位的数字c = num % 10
。接着判断b
和20的大小关系决定读法。最后,如果a
不为0,还需要加上百位的读法。
Solution
这道题目因为有许多需要通过数字去找到英文读法,所以一个很好的代码实现就是通过数组去做一个mapping,快捷又清晰。
Code
1 | class Solution { |
Summary
这道题目难度是hard,但其实算法上并没有很难的地方,这道题目关键的地方就在于分成3位处理的思路,以及对十位数的特殊处理。这道题目的分享到这里,感谢你的支持!