• LeetCode-13. Roman to Integer(罗马数字转阿拉伯数字)


    1.题目描述

    Given a roman numeral, convert it to an integer.

    Input is guaranteed to be within the range from 1 to 3999.

    2.我的分析思路

    罗马数字转成阿拉伯数字,这里面需要知道罗马数字的构成规则。罗马数字通过7个不同字母的重复或组合,能够表示出所有正整数(罗马数字中没有0)。

    • I = 1
    • V = 5
    • X = 10
    • L = 50
    • C = 100
    • D = 500
    • M = 1000

    比如:IV表示4,VI表示6,XIX表示19,XXI表示21。

    可以找到规律,如果左边的字母表示的数字小于右边的字母,则用右边的数字减去左边的数字;反之,则需要进行加法。

    我们从左向右进行遍历的时候,不太好计算出最终值;从另一个角度考虑,就是从右向左计算,就可以看出来了。

    好了,说到这里,就可以上代码了。

        private static Map<Character, Integer> map = new HashMap() {
            {
                put('I', 1);
                put('V', 5);
                put('X', 10);
                put('L', 50);
                put('C', 100);
                put('D', 500);
                put('M', 1000);
            }
        };
    
        public static int romanToInt(String s) {
            int length = s.length();
            int result = 0;
            int preVal = 0;
            for (int i = length - 1; i >= 0; i--) {
                char key = s.charAt(i);
                int value = map.get(key);
                if (value >= preVal) {
                    result += value;
                } else {
                    result -= value;
                }
    
                preVal = value;
            }
            return result;
        }
    

    3.其他的思路

    找到一个比较容易理解的,分享给大家。

    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];
    }
    
  • 相关阅读:
    31 整数中1出现的次数(从1到n整数中1出现的次数)
    算法寒假实习面试经过之 十一贝(offer) 联想研究院(电话一面 被拒)
    百度feed 寒假实习 一面二面(offer)
    30连续子数组的最大和
    29最小的K个数
    28数组中出现次数超过一半的数字
    MySQL操作数据库和表的基本语句(DDL)
    Oracle————存储过程与函数
    Oracle清空数据库中数据表数据的方法
    Linux之常用Shell脚本总结
  • 原文地址:https://www.cnblogs.com/f-zhao/p/6391790.html
Copyright © 2020-2023  润新知