LeetCode 13:【罗马数字转整数】最易理解!!

Problem: 13. 罗马数字转整数

思路

使用Map,键值对,针对特殊进行处理

解题过程

1. 先使用Map方法,让罗马数字和整数一一对应
2. 其次就是处理特殊情况,因为I遇到V,就不能按照常规进行相加,而是让V减去I,因为罗马数字的规则是左边是较小数,右边是较大数。 循环遍历,当遇到比后一个数小,那么进行相减,如果比后一个数大,进行相加,每次循环遍历,更新sum的值

逐步进行遍历:以III和IV为例:

III:

  • j=1,sum=0,第二位是I,不满足判断条件,相加,sum=0+1=1;
  • j=1,sum=1,第三位是I,不满足条件,相加,sum=1+1=2;
  • j=1,sum=2,下一位不存在,不满足条件,相加,sum=2+1=3;
  • 返回sum=3;

    IV:

    • j=1,sum=0 ,后一位是V,1<5,所以进行相减sum=0-1=-1;
    • j=1,sum=-1,后一位不存在,不满足条件,进行相加,sum=-1+5=4
    • 返回sum=4

          复杂度

          • 时间复杂度: O(n)

            Code

            class Solution {
                public int romanToInt(String s) {
                   Map<Character, Integer> map = new HashMap<>();
                    map.put('I', 1);
                    map.put('V', 5);
                    map.put('X', 10);
                    map.put('L', 50);
                    map.put('C', 100);
                    map.put('D', 500);
                    map.put('M', 1000);
            
                    int sum=0;//结果
                    int pre=0;//前一个
                    //j:现在的数字
                    for(int i=s.length()-1;i>=0;i--){
                        int j=map.get(s.charAt(i));//取出现在的数值
                        if(j<pre){
            
                            //比如IV: I>V 所以V-I=4
                            //前面的数小,减去前面的数
                            //反之
                            sum=sum-j;
                        }else{
                            sum=sum+j;
                        }
            
                        pre=j;
                    
                    }
                    return sum;
                }
            }
            class Solution {
            
                public int romanToInt(String s) {
            
                   Map<Character, Integer> map = new HashMap<>();
            
                    map.put('I', 1);
            
                    map.put('V', 5);
            
                    map.put('X', 10);
            
                    map.put('L', 50);
            
                    map.put('C', 100);
            
                    map.put('D', 500);
            
                    map.put('M', 1000);
            
                    
            
                    //进行键值对保存
            
                    //处理特殊情况:
            
                    int sum=0;
            
                    for(int i=0;i<s.length();i++){
            
                        int j=map.get(s.charAt(i));//获取当前值对应的整数
            
                    }
            
                        if(i+1<s.length&&j<map.get(s.charAt(i+1))//前一个和后一个进行比较,如果当前比后一位小
            
                        {
            
                            sum-=j;
            
                        }
            
                        else{
            
                            sum+=j;
            
                        }
            
                }
            
                    return sum;
            
            }

            评论
            添加红包

            请填写红包祝福语或标题

            红包个数最小为10个

            红包金额最低5元

            当前余额3.43前往充值 >
            需支付:10.00
            成就一亿技术人!
            领取后你会自动成为博主和红包主的粉丝 规则
            hope_wisdom
            发出的红包
            实付
            使用余额支付
            点击重新获取
            扫码支付
            钱包余额 0

            抵扣说明:

            1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
            2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

            余额充值