[LeeetCode刷题]13. Roman to Integer 罗马数字转整型题目介绍题目要求开始思路新的想法具体代码遇到的问题Tips题目介绍链接: 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。。。哦哦哦好吧,基础不牢,地动山摇。这回算是长记性了!顺带复习下:
本文链接: http://integer.immuno-online.com/view-704141.html