黑马程序员技术交流社区

标题: python 关于罗马字符转整数,我个人的解题思路(萌新第一次...) [打印本页]

作者: 圣凰院    时间: 2018-5-31 21:49
标题: python 关于罗马字符转整数,我个人的解题思路(萌新第一次...)
本帖最后由 圣凰院 于 2018-5-31 21:56 编辑

(萌瑟抖)
罗马数字包含以下七种字符:I, V, X, L,C,D 和 M。字符          数值I             1V             5X             10L             50C             100D             500M             1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
示例 1:
输入: "III"输出: 3

示例 2:
输入: "IV"
输出: 4


示例 3:
输入: "IX"
输出: 9


示例 4:
输入: "LVIII"
输出: 58
解释: C = 100, L = 50, XXX = 30, III = 3.

示例 5:
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4
"""
规律:例,"MCMXCIV",值为1994,根据单个字符所蕴含的值,两两比较,赋予单个值正负
M = 1000, C=100 , M = 1000, X = 10, C = 100 ,I= 1,V=5
定义一个和为sum = 0
从左往右开始比较
1.M > C ,第一位取正, M = +1000 , sum = 0 + (+1000) = 1000
2.C < M , 第二位取夫, C = -100 , sum = 1000 + (-100) = 900
3.M > X , 第三位取正, M = +1000 , sum = 900 + (+1000) = 1900
4.X < C , 第四位取负, X = -10 , sum = 1900 + (-10) = 1890
5.C > I , 第五位取负, C = +100 , sum = 1890 + (+100) = 1990
6.I < V , 第六位取负, I = -1 , sum = 1990 + (-1) = 1989
7. V 末尾默认相加, V = +5 , sum = 1989 + (+5) = 1994

观察上面解题思路
1.需用到判断大小,取其正负,应用if语句
2.字符串循环遍历,需用for循环,取单个字符两两比较,取其正负,再加上和sum
3.循环范围:0,len(s)-1    len(s)函数可统计出str元素个数,减一是因为所有从0 开始
4.XII 等例,当前位等于后一位时,取其正
5.最后一位默认取正
"""
def romanToInt(s):
    dic = {'M': 1000, 'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1}
    sum = 0
    for i in range(0, len(s) - 1):
        if dic[s] < dic[s[i + 1]]:
            sum -= dic[s]
        else:
            sum += dic[s]
    sum += dic[s[-1]]
    return sum

result = romanToInt("MCMXCIV")
print(result)


作者: 圣凰院    时间: 2018-5-31 21:54
本帖最后由 圣凰院 于 2018-6-4 07:42 编辑

.........................................................




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2