LeetCode刷题笔记之第十三题-罗马数字转整数

题目描述:罗马数字包括以下七种字符:I,V,X,L,C,D和M。
字符与数值的对应关系如下:
I—1,V–5,X–10,L–50,C–100,D–500,M–1000
例如:罗马数字中2写做II。12写作XII,即X+II。27写作XXVII,即为XX+V+II。通常情况下,罗马数字中小的数字在大的数字右边,但也存在特殊情况,例如4不写作IIII,而是IV。数字1在数字5的左边,所表示的数等于大数5减小数1得到数值4。数字9表示IX。这个特殊的规则只适用于以下六种情况:
I可以放在V(5)和X(10)的左边,来表示4和9;
X可以放在L(50)和C(100)的左边,来表示40和90;
C可以放在D(500)和M(1000)的左边,来表示400和900;
给定一个罗马数字,将其转换成整数,输入确保在1到3999的范围内。
基本思路:罗马数字转换成阿拉伯数字的时候,实际上是从左到右将每个字符对应的值累加的过程,XVI实际上是X(10)+V(5)+I(1)由于存在特殊规则,如"IX"可以看出(-1)+10=9;“XIX"可以看成是10-1+10=19。特殊规则可以进行如下处理,如果s[i]>s[i+1],那么s[i]在累加的时候需要加一个负号。
C++代码实现如下:

Class Solution{
Public:
      int romanToInt(string s){
         unordered_map<char,int>mp;//创建map放置罗马数字和对应的阿拉伯数字
         mp['I']=1;
         mp['V']=5;
         mp['X']=10;
         mp['L']=50;
         mp['C']=100;
         mp['D']=500;
         mp['M']=1000;
         int pos=0,neg=0;
         for(int i=0;i<s.size()-1;++i){
         if(mp[s[i]]<mp[s[i+1]])//如果左边的罗马数字小于右边的罗马数字,则让左边的罗马数字要加上负号
         neg-=mp[s[i]];
         else
         pos+=mp[s[i]]}
         pos+=mp[s.back()];
         return pos+neg;
         }
         };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值