2017/09/05-Roman to Integer

2017-09-05  本文已影响0人  风若水兮

Problems:

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

思路:

罗马数字就有下面七个基本符号:Ⅰ(1)Ⅴ(5)Ⅹ(10)L(50)C(100)D(500)M(1000)罗马数字与十进位数字的意义不同,它没有表示零的数字,与进位制无关。

计数规则:

1.若干相同数字连写表示的数是这些罗马数字的和,如III=3;

2.小数字在大数字前面表示的数是用大数字减去小数字,如IV=4;

3.小数字在大数字后面表示的数是用大数字加上小数字,如VI=6;

组合规则:

(1)基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。

(2)不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。

(3)V 和 X 左边的小数字只能用Ⅰ。

(4)L 和 C 左边的小数字只能用×。

(5)D 和 M 左 边的小数字只能用 C 。

以MCMXXC为例,第1位上的C比第0位上的M小,所以先加了一次,但其实在计算中应该是第2位上的M减去第一位上的C。所以在我们的循环中,其实应该减去两次C。

1.首先应该建立一个字典:def_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}

2.设一个常数为0(也就是我们最后转换后的数字)x=0

3.设置循环来转换数字:

循环应该在range(0,len(s))中,也就是0,1,2,。。。len(s)-1.☆

i=0或者当前位小于等于前一位时,直接加上当前位

否则,就要加上当前位并减去两倍的前一位

最后的代码为:

class Solution(object):

def romanToInt(self, s):

#Ⅰ(1)Ⅴ(5)Ⅹ(10)L(50)C(100)D(500)M(1000)

#当符号Ⅰ、Ⅹ或C位于大数的后面时就作为加数;位于大数的前面就作为减数。

    def_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}

    x=0

   for i in range(0,len(s)):

       if i==0 or def_dict[s[i]]<= def_dict[s[i-1]]:

            x+= def_dict[s[i]]

       else:

            x+= def_dict[s[i]]-2*def_dict[s[i-1]]

  return x

大神的方法:
classSolution:
# @param {string}s#
 @return {integer}
def romanToInt(self, s):
      roman = {'M':1000,'D':500,'C':100,'L':50,'X':10,'V':5,'I':1}   
      z =0
     for i in range(0, len(s) -1):
          if roman[s[i]] < roman[s[i+1]]:           
                  z -= roman[s[i]]
          else:           
                  z += roman[s[i]]
   return  z + roman[s[-1]]
关键在于最后一位肯定是加的,那么前面的该减减,该加加,不需要另外考虑i=0的情况。

以下为阿拉伯数字转化为罗马数字:

在上述的组合规则中需要注意的是:
小数在大数左边只能有1位,且XL,XC,CD,CM,IV,IX是固定且唯一可能出现的小数在前面的组合!!!

num_list = [1000,900,500,400,100,90,50,40,10,9,5,4,1]

str_list = ['M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I']

代码如下:使用一个for循环与阿拉伯数字进行比较即可。其中注意字符串的初始化。

def IntToRoman(x):

#把所有可能的数的可能组合列举出来

    s=''

    num_list = [1000,900,500,400,100,90,50,40,10,9,5,4,1]

    str_list = ['M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I']

    for i in range(0,len(num_list)):

          if x >= num_list[i]:

               x-= num_list[i]

               s+= str_list[i]

      return s

上一篇下一篇

猜你喜欢

热点阅读