Leetcode 13题 罗马数字转换为整形

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

查了下罗马数字的进制与表示规律。
首先是进制
Roman numerals ( 罗马数字 ) :
I = 1
V = 5
X =10
L = 50
C = 100
D = 500
M = 1000
规律
III = 1+1+1=3
IV = 5-1=4
VI = 5+1=6
IX = 10-1=9
XI = 10+1=11
XXI = 10+10+1=21
LXX=50+10+10=70
LXXX=80
XC=100-10=90
,,,,,,,,,,,,
如此,总结一下,数字表示从左往右数按照权值从大到小排列,跟阿拉伯数字规律差不多,区别是同样的数字只能连续出现3次,当表示4或者9的时候,需要将小权重的数字如X(10)放在大权重数字C(100)前,做减法。

好了,知道进制与表示规律后,这题思路简单,声明一个结构体,在其中存放权值与对应符号,然后对输入的罗马字符串一一匹配,累加即可。只是在碰到表示4或9及其他们的10倍、100倍等时候要进行判定,特殊处理。

代码如下:
class Solution {
public:
int romanToInt(string s) {
typedef struct romanWeight
{
char ch;
int val;
}romanWight;

romanWight weight[] =
{
{‘I’, 1}, {‘V’, 5}, {‘X’, 10}, {‘L’, 50}, {‘C’, 100}, {‘D’, 500}, {‘M’, 1000}
};

//默认输入的罗马数字符合规定,就不进行正确性检查了
int n = s.size();
int sum=0, w=1000;
//w记录每一位的权重,当发现查询的val>w时,就倒回去,变成负数,或者直接减去两倍之前的小权的数

// for( auto i=s.begin(); i != s.end(); ++i )
for( int i=0; i < n; ++i)
{
//指针p用来查寻权值,每次循环后都回到初始地方
romanWeight *p = &weight[0];
while( s[i] != p->ch )
++p;
if( w < p->val ) //出现形成4或9的情况
sum = sum + p->val - w - w;
else
sum = sum + p->val;
w = min(p->val, w);
}

return sum;
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值