1道模拟题花了2个多小时,我也是醉了。一方面由于好久没有刷题了,一方面这道题乱七八糟的细节特别多。于是就想简单总结下。
题意:
将整型数字(231-1以内)转化成英文单词,如:
思路很普通:
2^31 = 2 147 483 648,
我们可以将数字转化成字符串后,每3个字符分为1组,整体字符串无非就是每组数字构成的串+“Billion/Million/Thousand”之类;可以自定义一个子函数来求3位以内的数的英文表示,这里需要提前将0-9、10-19、20、30、40、...、90之类的英文表示存入数组中,以便利用下标来访问,有点儿哈希的意思。
考虑到python的灵便性,于是便用python来编码了;由于两个单词之间用空格“ ”连接,而用字符串时不太好控制何时加空格,何时不加,例如1001,我一开始用字符串时就搞成了one-thousand--one(且用‘-’表示空格);其实可以先用list来存储每个单词,最后再用空格将它们连接起来就好了。
详细代码如下:
class Solution(object):
def num2str(self,snum):
hsh = ("Zero","One","Two", "Three", "Four", "Five", "Six", "Seven", "Eight","Nine")
hsh1 = ("Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen")
hsh2 = ("","","Twenty", "Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety")
sstr = []
lenth = len(snum)
if lenth == 3:
if(int(snum[0]))>0:
sstr.extend([hsh[int(snum[0])],"Hundred"])
if int(snum[1])>1:
sstr.append(hsh2[int(snum[1])])
if int(snum[2])>0:
sstr.append(hsh[int(snum[2])])
elif int(snum[1])==1:
sstr.append(hsh1[int(snum[2])])
else:
if (int(snum[2])>0):
sstr.append(hsh[int(snum[2])])
elif lenth == 2:
if int(snum[0])>1:
sstr.append(hsh2[int(snum[0])])
if int(snum[1])>0:
sstr.append(hsh[int(snum[1])])
elif int(snum[0])==1:
sstr.append(hsh1[int(snum[1])])
elif lenth == 1:
sstr.append(hsh[int(snum[0])])
return (' ').join(sstr)
def numberToWords(self, num):
"""
:type num: int
:rtype: str
"""
tbl = (""," Thousand "," Million "," Billion ")
numstr = str(num)
sstr = ""
lenth = len(numstr)
while lenth > 0:
mod = lenth % 3
if mod == 0:
mod = 3
if len(self.num2str(numstr[0:mod]))>0:
sstr += self.num2str(numstr[0:mod])
sstr += tbl[(lenth-1) / 3]
numstr = numstr[mod:]
lenth = len(numstr)
if(sstr[-1]==' '):
sstr = sstr[0:-1]
return sstr