A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

圣凰院

初级黑马

  • 黑马币:34

  • 帖子:16

  • 精华:0

本帖最后由 圣凰院 于 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。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 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)

1 个回复

正序浏览
本帖最后由 圣凰院 于 2018-6-4 07:42 编辑

.........................................................
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马