前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 13. Roman to Integer 罗马数字转整数

LeetCode 13. Roman to Integer 罗马数字转整数

作者头像
明明如月学长
发布2021-08-27 16:14:52
2350
发布2021-08-27 16:14:52
举报

题目链接: https://leetcode.com/problems/roman-to-integer/description/

题目描述:

Roman numerals are represented by seven different symbols: IVXLCD and M.

代码语言:javascript
复制
Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

  • I can be placed before V (5) and X (10) to make 4 and 9. 
  • X can be placed before L (50) and C (100) to make 40 and 90. 
  • C can be placed before D (500) and M (1000) to make 400 and 900.

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.

Example 1:

代码语言:javascript
复制
Input: "III"
Output: 3

Example 2:

代码语言:javascript
复制
Input: "IV"
Output: 4

Example 3:

代码语言:javascript
复制
Input: "IX"
Output: 9

Example 4:

代码语言:javascript
复制
Input: "LVIII"
Output: 58
Explanation: C = 100, L = 50, XXX = 30 and III = 3.

Example 5:

代码语言:javascript
复制
Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

题目提示:

提示1:

代码语言:javascript
复制
I - 1
V - 5
X - 10
L - 50
C - 100
D - 500
M - 1000

提示2:

代码语言:javascript
复制
Rules:
* If I comes before V or X, subtract 1 eg: IV = 4 and IX = 9
* If X comes before L or C, subtract 10 eg: XL = 40 and XC = 90
* If C comes before D or M, subtract 100 eg: CD = 400 and CM = 900

我们可以观察出规律并得出算法思路:

  • 先初始化一个长度和字符个数相等的整型数组
  • 遍历每个字符解析到对应的数值
  • 重新遍历一次,如果前面的比后面的,就将前面的和减去后面的值否则相加。

代码:

代码语言:javascript
复制
 /**
     * 罗马数字转数字
     *
     * @param s 罗马数字字符串
     * @return 数字
     */
    public int romanToInt(String s) {
        //存放每个罗马字母对应的数值
        int[] numbers = new int[s.length()];

        for (int i = 0; i < s.length(); i++) {
            switch (s.charAt(i)) {
                case 'M':
                    numbers[i] = 1000;
                    break;
                case 'D':
                    numbers[i] = 500;
                    break;
                case 'C':
                    numbers[i] = 100;
                    break;
                case 'L':
                    numbers[i] = 50;
                    break;
                case 'X':
                    numbers[i] = 10;
                    break;
                case 'V':
                    numbers[i] = 5;
                    break;
                case 'I':
                    numbers[i] = 1;
                    break;
                default:
            }
        }

        int sum = 0;
        for (int i = 0; i < numbers.length - 1; i++) {
            if (numbers[i] < numbers[i + 1]) {
                sum -= numbers[i];
            } else {
                sum += numbers[i];
            }
        }

        return sum + numbers[numbers.length - 1];
    }

需要特别注意的是根据《阿里巴巴Java编程规范》 1.7控制语句 这一节的 第一条所示:

上面的switch块内,需要加上一个default语句。

另外顺便推荐大家多看看编程规范,养成好习惯。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档