LeetCode Roman to Integer

题目

Given a roman numeral,convert it to an integer.

Input is guaranteed to bewithin the range from 1 to 3999.

 

给罗马数字求数字,

依次获取每个罗马数字位的字符,查表。

 

代码:

string c1[4][10]={"","I","II","III","IV","V","VI","VII","VIII","IX",	//数字表
	"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
	"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
	"","M","MM","MMM"};

char c2[9]={'I','V','X','L','C','D','M',' ',' '};	//字符表

class Solution {
public:
    int romanToInt(string s) {
		int ans=0;
		string temp;	//一位罗马数字
		int radix=1000;
		int c2begin=6,c2end=9;	//每位可取字符头尾
		int i,j,k=0,q=0;
		for(i=3;i>=0;i--)	//由高位至低位
		{
			temp.clear();
			j=c2begin;
			while(j<c2end&&k<s.size())	//取字符,直到取完相应罗马位
			{
				for(j=c2begin;j<c2end;j++)
				{
					if(s[k]==c2[j])
					{
						temp+=c2[j];
						k++;
						break;
					}
				}
			}
			for(q=0;q<10;q++)	//转换相应罗马位
			{
				if(temp==c1[i][q])
				{
					ans+=radix*q;
					break;
				}
			}
			c2begin-=2;
			c2end-=2;
			radix/=10;
			if(k>=s.size())
				break;
		}
		return ans;
    }
};

 

不按位查表:

char c2[9]={'I','V','X','L','C','D','M',' ',' '};	//字符表

class Solution {
public:
    int romanToInt(string s) {
		int ans=0;
		int temp;	//每位转换值
		int flag;	//正负标记
		int radix=1000;
		int c2begin=6;	//每罗马位字符开始位置
		int k=0;
		for(int i=3;i>=0;i--)	//由高位至低位
		{
			temp=0;
			flag=-1;
			while(k<s.size())	//取字符,直到取完相应罗马位
			{
				if(s[k]==c2[c2begin])
				{
					temp+=flag;
					k++;
				}
				else if(s[k]==c2[c2begin+1])
				{
					temp+=5;
					flag=1;
					k++;
				}
				else if(s[k]==c2[c2begin+2])
				{
					temp+=10;
					flag=1;
					k++;
				}
				else
					break;
			}
			ans+=abs(temp)*radix;
			c2begin-=2;
			radix/=10;
			if(k>=s.size())
				break;
		}
		return ans;
    }
};



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值