算法题:整数转换英文表示
问题分析
123
,它的英文表示就是 "One Hundred Twenty Three"
,如果是 1000
,英文就变成了 "One Thousand"
。当然,问题难度会随数字的增大而增加。比如更大的数 12345
,它应该被转换为 "Twelve Thousand Three Hundred Forty Five"
。思路分析
1到19的数字有独立的英文单词,像 1 -> "One"
,13 -> "Thirteen"
,这些可以直接查表。20到99之间的数字有一个十位单位的前缀,像 21 -> "Twenty One"
,56 -> "Fifty Six"
,可以拆解为十位和个位。100、1000、10000等更高的单位就比较规律了,分别是 Hundred
,Thousand
,Million
等。
代码实现
numberToWords
,并准备一个辅助的数字词典。class Solution:
def numberToWords(self, num: int) -> str:
if num == 0:
return "Zero"
# 数字词典
less_than_20 = ["", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten",
"Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"]
tens = ["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"]
thousands = ["", "Thousand", "Million", "Billion"]
def helper(n):
# 递归处理每个三位数
if n == 0:
return ""
elif n < 20:
return less_than_20[n]
elif n < 100:
return tens[n // 10] + (" " + less_than_20[n % 10] if n % 10 != 0 else "")
else:
return less_than_20[n // 100] + " Hundred" + (" " + helper(n % 100) if n % 100 != 0 else "")
res = ""
i = 0
while num > 0:
if num % 1000 != 0:
res = helper(num % 1000) + " " + thousands[i] + " " + res
num //= 1000
i += 1
return res.strip()
# 测试
sol = Solution()
print(sol.numberToWords(12345)) # Output: "Twelve Thousand Three Hundred Forty Five"
代码解释
辅助数组:
less_than_20
是1到19的数字英文表示。tens
是20到90的倍数,方便我们表示两位数的十位。thousands
用于表示每三位数的单位(千、百万、十亿等)。
helper
函数:这个递归函数负责处理三位数以内的数字。通过递归调用它,我们可以将更大的数字分解成多个三位数的部分。比如, 12345
就可以分解成12
和345
,然后分别处理。
我们通过 while
循环不断地从右往左处理数字的每一部分(每三位)。每处理一部分,就会根据当前的单位(如“Thousand”,“Million”等)拼接到结果字符串中。
最后,返回结果字符串时,会去除掉多余的空格。
注意事项
零的特殊处理: 如果输入是0,直接返回 "Zero"
。空格问题: 由于英文中有些数字的拼接会有多余的空格(例如 20 + 1
会得到"Twenty One"
),所以我们需要在拼接时确保不会有多余的空格。
总结
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。