LeetCode 13. Roman to Integer 原创Java参考解答

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)

解题方法:

  1. 遍历罗马数字的每一个字符,把它们的阿拉伯数值加入到一个数组中。
  2. 参考上文所述罗马数字右加左减的特征,一一访问该数组中每一个数字,如果后面一个数字大于访问位置上的数字,则从和中减去该位置数字。反之,若后面位置的数字不大于访问位置上的数字,则从和中加上该位置数字。

参考代码

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];
    }
}

相关题目

LeetCode All in One 原创题目讲解汇总

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注