leetcode每日不做题
461. 汉明距离
852. 山脉数组的峰顶索引
374. 猜数字大小
278. 第一个错误的版本
474. 一和零
231. 2 的幂
342. 4的幂
1074. 元素和为目标值的子矩阵数量
477. 汉明距离总和
12. 整数转罗马数字
1190. 反转每对括号间的子串
692. 前K个高频单词
1738. 找出第 K 大的异或坐标值
1442. 形成两个异或相等数组的三元组数目
993. 二叉树的堂兄弟节点
421. 数组中两个数的最大异或值
13.罗马数字转整数
本文档使用 MrDoc 发布
-
+
首页
13.罗马数字转整数
[力扣原题链接](https://leetcode-cn.com/problems/roman-to-integer/) ## 题目 罗马数字包含以下七种字符: `I`, `V`, `X`, `L`,`C`,`D` 和 `M`。 ``` 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 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:** ``` 输入: "III" 输出: 3 ``` **示例 2:** ``` 输入: "IV" 输出: 4 ``` **示例 3:** ``` 输入: "IX" 输出: 9 ``` **示例 4:** ``` 输入: "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3. ``` **示例 5:** ``` 输入: "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4. ``` **提示:** * 1 <= s.length <= 15 * s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M') * 题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内 * 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。 * IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。 * 关于罗马数字的详尽书写规则,可以参考 [罗马数字 - Mathematics](https://b2b.partcommunity.com/community/knowledge/zh_CN/detail/10753/罗马数字#knowledge_article "罗马数字 - Mathematics") 。 ## 思路 每个数字段对应一个或两个字符 **:** ``` 数字段 符号 >=1000 M >=900 CM >=500 D >=400 CD >=100 C >=90 XC >=50 L >=40 XL >=10 X >=9 IX >=5 V >=4 IV >0 I ``` 遍历整个罗马数字,用罗马符号**从小到大**进行比较(为了判断是否又满足**罗马数字中小的数字在大的数字的左边**的特殊规则的符号出现),在符合的符号段进行对应数值的累加,最终得到的累加数就是该罗马数字对应的整数。 ## 代码 语言:Java ``` class Solution { public int romanToInt(String s) { int num = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); switch (c) { case 'I': if (i != s.length() - 1) { if (s.charAt(i + 1) == 'X') { num += 9; i++; } else if (s.charAt(i + 1) == 'V') { num += 4; i++; } else { num++; } } else { num++; } break; case 'V': num += 5; break; case 'X': if (i != s.length() - 1) { if (s.charAt(i + 1) == 'L') { num += 40; i++; } else if (s.charAt(i + 1) == 'C') { num += 90; i++; } else { num += 10; } } else { num += 10; } break; case 'L': num += 50; break; case 'C': if (i != s.length() - 1) { if (s.charAt(i + 1) == 'D') { num += 400; i++; } else if (s.charAt(i + 1) == 'M') { num += 900; i++; } else { num += 100; } } else { num += 100; } break; case 'D': num += 500; break; case 'M': num += 1000; break; default: return 0; } } return num; } } ``` ## 力扣官方代码 * **思路** 通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,那么可以将每个字符视作一个单独的值,累加每个字符对应的数值即可。 例如 XXVII 可视作 X+X+V+I+I=10+10+5+1+1=27。 若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。对于这种情况,我们也可以将每个字符视作一个单独的值,若一个数字右侧的数字比它大,则将该数字的符号取反。 例如 XIV 可视作 X−I+V=10−1+5=14。 * **代码** 语言:Java ``` class Solution { Map<Character, Integer> symbolValues = new HashMap<Character, Integer>() {{ put('I', 1); put('V', 5); put('X', 10); put('L', 50); put('C', 100); put('D', 500); put('M', 1000); }}; public int romanToInt(String s) { int ans = 0; int n = s.length(); for (int i = 0; i < n; ++i) { int value = symbolValues.get(s.charAt(i)); if (i < n - 1 && value < symbolValues.get(s.charAt(i + 1))) { ans -= value; } else { ans += value; } } return ans; } } ```
renyi567
2021年5月15日 09:25
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
阅读量
次
本站总访问量
次
本站访客数
人次
Markdown文件
分享
链接
类型
密码
更新密码