419罗马数字转整数
题目
http://www.lintcode.com/zh-cn/problem/roman-to-integer/
给定一个罗马数字,将其转换成整数。返回的结果要求在1到3999的范围内。
样例
IV -> 4
XII -> 12
XXI -> 21
XCIX -> 99
思路
- 一开始用两个列表来装罗马数字的表示和阿拉伯数字1,5,10,50,100,500,1000,后面直接用字典,两种方式代码如下
- 根据罗马数字,大小=大+小;小大=大-小
- 所以将罗马数字从后往前,首先一开始的数字是最后的数字,判断倒数第二个是否大于最后一个数字,大的话,加上倒数第二个,小于的话,减去倒数第二个。循环直到遇到罗马数字的第一个数字
- 为了容易理解,可将字符串逆转,然后从第一个数字开始判断运算
代码
class Solution:
"""
@param: s: Roman representation
@return: an integer
"""
#列表
"""
def romanToInt(self, s):
# write your code here
luoma_biao = ['I', 'V', 'X', 'L', 'C' , 'D','M']
luoma_zhi = [1, 5, 10, 50, 100, 500, 1000]
#从后到前,可逆转,这样直接从前到后
s=s[::-1]
int_z = luoma_zhi [luoma_biao.index(s[0])]
for i in range(1,len(s)):
#后面大于前面的,加
if luoma_zhi [luoma_biao.index(s[i]) ] >=luoma_zhi [luoma_biao.index(s[i-1])]:
int_z = int_z + luoma_zhi [luoma_biao.index(s[i]) ]
else:
#后面小于前面的,减,可能出现后面的总数大于前面的,此时需要用到绝对值,直接将特殊情况统一化
int_z =abs( luoma_zhi[luoma_biao.index(s[i]) ]-int_z )
return int_z
"""
def romanToInt(self, s):
# write your code here
#字典
luoma = {'I':1, 'V':5, 'X':10, 'L':50, 'C' :100, 'D':500,'M':1000}
#从后到前,可逆转,这样直接从前到后
s = s[::-1]
int_z = luoma[s[0]]
for i in range(1,len(s)):
if luoma[s[i]] >= luoma[s[i-1]]:
int_z = int_z + luoma[s[i]]
else:
int_z = abs(luoma[s[i]] - int_z)
return int_z
688The Number In Words
题目
http://www.lintcode.com/zh-cn/problem/the-number-in-words/#
Given a non-negative integer n, print the number in words.
注意事项
n <= 2147483647
样例
Given n = 125
Return one hundred twenty five
思路
- 一开始没有考虑到百万十亿的情况,看别人博客说按着三位一组进行处理
- 其实可以用整数转罗马数字那道题思路,按着位来,只是这次的整数比较大,包括十亿和百万,则需要对整数以此 除十亿 百万 千 ,每次得到的商都有可能是三位数,所以又需要对三位数进行处理
输入:12 3 456 789
百万 千 个
① ÷ 十亿 123456789 / 十亿 =0
② ÷ 百万 (123456789 % 十亿) / 百万 =123
③ ÷ 千 (123456789 % 十亿%百万)=456789
456789 /千 =456
④ ÷ 个 456789%千 /个=789
123 百万:one hundred twenty three million
456千:four hundred fifty six thousand
789:seven hundred eighty nine
结果:
"one hundred twenty three million four hundred fifty six thousand seven hundred eighty nine"
代码
class Solution:
"""
@param: : the number
@return: the number in words
"""
def convertWords(self, number):
# Write your code here
dict1={0:'zero',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'}
#num为dict1的键时,返回键值
if number in dict1:return dict1[number]
result = []
#十亿
if number /1000000000 !=0:
result.append(dict1[number/1000000000])
result.append('billion')
number = number%1000000000
#百万
if number / 1000000!=0:
self.sanwei(number/ 1000000,result,dict1)
result.append('million')
number = number% 1000000
#千
if number /1000!=0:
self.sanwei(number /1000,result,dict1)
result.append('thousand')
number = number%1000
#百
if number !=0:
self.sanwei(number , result,dict1)
#将列表按空格进行连接为字符串
x=' '.join(result)
return x
#三位百处理
def sanwei(self ,number , result ,dict1):
if number /100 !=0:
result.append(dict1[number/100])
result.append('hundred')
number = number % 100
if number != 0:
if number in dict1:
result.append(dict1[number])
else:
result.append(dict1[number/10*10])
result.append(dict1[number%10])
return result