[LeeetCode刷题]13. Roman to Integer 罗马数字转整型 Java

[LeeetCode刷题]13. Roman to Integer 罗马数字转整型

题目介绍

链接: link.在这里插入图片描述

题目要求

编写一个程序完成将输入的罗马数字的String字符串转换成对应的int型数值。

开始思路

开始想的比较复杂,因为罗马数字不是单纯的大数字在右边,会有意外的情况比方说IV代表是5-1=4.所以想到的是先遍历字符串找到字符串中代表数值最大的字符位置再分别判断和左边字符大小,如果左边小于自己的话特殊处理,正常的话就直接将所有字符代表的数值加到一起就是最后的结果。然后发觉这么考虑会比较复杂,不光会考虑各自左边的字符还可能牵扯到两个大字符并列的问题。

新的想法

其实按照开始的想法,解法基本已经出来了。就是大部分的罗马数字基本都是按照的是将各个字符位置的数值相加就可以得到最后的int数值,例如III、VI、LVIII等等,实质就是遍历字符串,将所有字符代表的数值相加:

III=1+1+1=3、VI=5+1=6、LVIII=50+5+1+1+1=58。

比较特殊的情况是这种如IV、IX等等,其同样是一样的处理遇到一个字符就加上该字符对应的数值,就是要多一层判断,当前一个遍历的字符代表的数值小于当前的数值的时候减去两倍的前一个数值即可,例如:

IV=1+5-1x2=4、iX=1+10-2x1

IV时就是先遍历到I将结果+1.在遍历到V将结果+5,判断出I<V将结果减去两倍小的字符值-2,最终得到4,同理可得IX。

因此采用的方法时先利用一个HashMap将全部的罗马字符对应的数值通过键值对的方式保存下来,然后遍历的时候直接通过索引进行操作。具体代码如下:

具体代码

class Solution {
    public int romanToInt(String s) {
        HashMap<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);
            }
        };
        int ans=0;
        for(int i=0;i<s.length();i++)
        {
            ans = ans+map.get(s.charAt(i));
            if(i!=0&&map.get(s.charAt(i))>map.get(s.charAt(i-1)))
                ans = ans - 2*map.get(s.charAt(i-1));
        }
        return ans;
    }
}

遇到的问题

虽然最后题目写出来了,但因为我的Java也是因为实验室的项目需要用到匆忙自学的,很多基础知识点其实是不扎实的。比方说,虽然项目里也用到的HashMap来存储数据,但是我好像都是照着来用很少自己打过(暴露了代码搬运工的实质哈哈),比方说这次用的时候特地查了一下HashMap的初始化赋值方式。
这还不是最气的,是当我执行代码的时候提示我HashMap<char,int>的泛型里不能有原始数据类型,因为一开始想的就是返回int比较的是char,所以我想都没想就写了char和int。涨知识了然后我就习惯性的将int改成了Integer,char改成了Char。可是还是报Char错,难道char的引用类型是String?我已经有点凌乱了,问了同门的char的应用类型是什么,她也回答是Char哈哈。然后一查发现是Character。。。哦哦哦好吧,基础不牢,地动山摇。这回算是长记性了!顺带复习下:

  • a.整形    byte    short    int        long
    
  • 包装类    Byte    Short    Integer    Long
    
  • b.浮点型    float    double
    
  • 包装类    Float    Double
    
  • c.字符    char
    
  • 包装类    Character
    
  • d.布尔型    boolean
    
  • 包装类    Boolean
    

Tips

最后的最后,讲讲我思考过程中发现的罗马数字可能存在的问题,就是例如

VX=5其实是和V=5代表的一样的数值

也就是说罗马数字的同一个数值是可以通过不同的方式来表达的,不知道这样严不严谨,但是定义上确实是正确的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值