数字1到5可以被写成:one,two,three,four,five,这些字母的总长度为:3+3+5+4+4=19,现在求序列1到1000(包括1000),这些数字写成单词,总长度为多少?空格和连字符不计算。
比如342(three hundred and forty-two)长度为23,115(one hundred and fifteen)长度为20,1000(one thousand)长度为11。
求解说明
假设N为[1,1000]之间的数字,可以分为以下四种情况:
(1)、当0<N<=20,直接1-20范围内数字对应的单词,用数字作为下标直接取出数组中的单词;
(2)、当20<N<100,此时数字由个位和十位组成,十位从20<N<100取出,对应个位是否为零分类讨论;当个位数不为0时,还要从0<N<=20内取出个位;
(3)、当100< =N <100,此时英语单词中会包含“hundred”这个单词,在不是整百时,还需要用到“and”这个单词。此时单词组成是这样的:百位+hundred+(“and”+0<N<=20对应的单词)或者当b大于20时,此时从20<N<100取出对应单词;
(4)、当N=1000时,作为常量,即“one thousand”。
具体代码如下:
mapping = {1:'one',2:'two',3:'three',4:'four',5:'five',6:'six',7:'seven',8:'eight',9:'nine',10:'ten',
11:'eleven',12:'twelve',13:'thirteen',14:'fourteen',15:'fifteen',16:'sixteen',17:'seventeen',18:'eighteen',19:'nineteen',
20:'twenty',30:'thirty',40:'forty',50:'fifty',60:'sixty',70:'seventy',80:'eighty',90:'ninety',100:'hundred',1000:'thousand'}
def less_than_twenty(n): #0~20
if n<=20 and n>0:
return mapping[n]
def less_than_hundred(n): #20~100
if n>20 and n<100:
a=int(n/10) #十位数
b=n%10 #个位数
if b==0:
return mapping[a*10]
else:
return mapping[a*10]+mapping[b]
def less_than_thousand(n): #100~1000
words = []
if n>=100 and n<1000:
a = int(n/100)
b = n%100
words.append(mapping[a])
words.append(mapping[100])
if b>0 and b<=20:
words.append('and')
words.append(less_than_twenty(b))
if b>20:
words.append('and')
words.append(less_than_hundred(b))
return ''.join(words)
def get_words(n):
if n>0 and n<=20:
return less_than_twenty(n)
elif n<100:
return less_than_hundred(n)
elif n>=100 and n<1000:
return less_than_thousand(n)
elif n==1000:
return 'onethousand'
res = map(get_words,[x for x in range(1,1001)])
print(sum(map(len,res)))
结果
21124
这道题是综合了字典、列表、函数、逻辑判断和高级函数,如果这道题会了,Python极速入门差不多了。
我把最近分享的入门题目整理在了一起,如果有需要的小伙伴可以后台「入门」即可获取,每道题都很经典,都是我花时间从leetcode上找的,对于编程小白或者是Python的初学者都是很有帮助的。
最后,我再给大家分享一个Python的入门与进阶的视频,是一个慕课网上的视频,老师通过具体实例来讲Python知识,通俗易懂,大家有需要,后台回复「1024」即可获得。