LeetCode 13. Roman to Integer 原创Java参考解答
问题描述
https://leetcode.com/problems/integer-to-roman/
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
解题思路
题目是求把一个罗马数字 s 转换为阿拉伯数字。
这道题是Integer to Roman的相反过程。同样,这道题需要有对罗马数字的表示方法的了解。参考wiki百科
一个数字可以由7个基本罗马数字拼凑组成。7个罗马数字分别是 I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。
罗马数字特点:
- 一个罗马数字重复几次,就表示这个数的几倍。比如 III (3)。
- 罗马数字右加左减:
- 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。VI (6)
- 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。IV (4)
解题方法:
- 遍历罗马数字的每一个字符,把它们的阿拉伯数值加入到一个数组中。
- 参考上文所述罗马数字右加左减的特征,一一访问该数组中每一个数字,如果后面一个数字大于访问位置上的数字,则从和中减去该位置数字。反之,若后面位置的数字不大于访问位置上的数字,则从和中加上该位置数字。
参考代码
public class Solution { public int romanToInt(String s) { int[] nums = new int[s.length()]; for (int i = 0; i < s.length(); i++) { switch (s.charAt(i)) { case 'M': nums[i] = 1000; break; case 'D': nums[i] = 500; break; case 'C': nums[i] = 100; break; case 'L': nums[i] = 50; break; case 'X': nums[i] = 10; break; case 'V': nums[i] = 5; break; case 'I': nums[i] = 1; break; } } int sum = 0; for (int i = 0; i < nums.length - 1; i++) { if (nums[i] < nums[i + 1]) { sum -= nums[i]; } else { sum += nums[i]; } } return sum + nums[nums.length - 1]; } }