题目:
将非负整数转换为其对应的英文表示。可以保证给定输入小于 231 - 1 。
示例 1:
输入: 123 输出: "One Hundred Twenty Three"
示例 2:
输入: 12345 输出: "Twelve Thousand Three Hundred Forty Five"
示例 3:
输入: 1234567 输出: "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"
示例 4:
输入: 1234567891 输出: "One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One"
思路:
英文的数字统计是以1000为单位的,所以按千为单位进行处理即可,其中11-19为特殊数字需要特殊处理
def numberToWords(self, num: int) -> str:
w3 = [" Thousand"," Million"," Billion"]
w2 = [" Twenty"," Thirty"," Forty"," Fifty"," Sixty"," Seventy"," Eighty"," Ninety"]
w1 = [" One"," Two"," Three"," Four"," Five"," Six"," Seven"," Eight"," Nine"," Ten"," Eleven"," Twelve"," Thirteen"," Fourteen"," Fifteen"," Sixteen"," Seventeen"," Eighteen"," Nineteen"]
if num == 0:
return "Zero"
n = ''
i = 0
while num :
j = ''
k = num % 1000
num = num // 1000
if num % 1000 :
j = w3[i]
if k // 100 :
j += w1[k//100-1] + " Hundred"
k = k % 100
if k > 19 :
j += w2[k//10-2]
k = k % 10
if k:
j += w1[k-1]
i += 1
n = j + n
return n.strip()
另一个思路,使用递归,感谢leetcode评论中的提供者
def numberToWords(self, num):
"""
:type num: int
:rtype: str
"""
d1=['','One','Two','Three','Four','Five','Six','Seven','Eight','Nine','Ten','Eleven','Twelve','Thirteen','Fourteen','Fifteen','Sixteen','Seventeen','Eighteen','Nineteen','Twenty']
d2=['','Ten','Twenty','Thirty','Forty','Fifty','Sixty','Seventy','Eighty','Ninety']
if num==0:return 'Zero'
if num<=20:return d1[num]
if num<100:
t,d=num//10,num%10
return d2[t]+' '+d1[d] if d>0 else d2[t]
if num<1000:
h=num//100
if num%100==0:return d1[h]+' Hundred'
return d1[h]+' Hundred '+self.numberToWords(num%100)
if num<10**6:
th=num//10**3
if num%10**3==0:
return self.numberToWords(th)+' Thousand'
return self.numberToWords(th)+' Thousand '+self.numberToWords(num%10**3)
if num<10**9:
mi=num//10**6
if num%10**6==0:
return self.numberToWords(mi)+' Million'
return self.numberToWords(mi)+' Million '+self.numberToWords(num%10**6)
if num<10**12:
bi=num//10**9
if num%10**9==0:
return d1[num//10**9]+' Billion'