python_lintcode_419罗马数字转整数_688The Number In Words

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
    789seven 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值