LeetCode 13Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
思路很简单,只需要掌握罗马数字的计算规则就行了;罗马数字共有7个,I=1,V=5,X=10,L=50,C=100;D=500,M=1000;
计算法则是,当两个罗马数字靠在一起时,如果左边的数字较小,则值为右边的罗马数字减去左边的罗马数字,否则就是两个数字相加,那么一串罗马数字的计算就是挨着把每个罗马数字对应的整数值加起来或者相减就可以,为了方便,从左到右扫描罗马串时,如果该数字比右边的小,就将其记为当前数字的负值,然后全部加起来,也就避免了做减法。由于所给的罗马数字串的值不超过4000,可以不用考虑其他特别的计算符号了。时间性能是O(N)。
看了大佬们的解法,其实也没有更快的了,更多的是使用map等优秀的数据结构来提升一点速度。普遍争论的是罗马数字的合法性,上面的写法其实是瞎算的,如果给了一串不合法的罗马数字,也能算出结果,但是可能LeetCode太老实了给的都是合法数字,所以瞎算也能过?
真实的情况是罗马数字左减的情况有限,也就是说左边比右边小需要减的情况只能有I,X,C;而且左减时不能跨越段位,右加时最多连续加3个……规则并不是那么容易,鉴于这道题的等级是easy,给的样例应该都是合法的,所以只需要一股脑算就行了。