leetcode刷题心得分享

转眼就快要大四了,感叹时间飞快的同时也想开始追求一些新东西了,这次是本人第一次发表博客,各位大神看到请忽略。
leetcode上有这样一道题目,虽说难度不大,但第一次遇到的时候感觉挺新奇的,题目的要求是将罗马数字转换为十进制数(输入罗马数字范围限制在3999以内,这点很重要),原题目链接如下:
https://leetcode.com/problems/roman-to-integer/
要做这道题目,首先需要了解罗马数字的的表示规则。罗马数字有7个基本符号,其符号及含义分别为:Ⅰ(1)Ⅴ(5)Ⅹ(10)L(50)C(100)D(500)M(1000)。
在构成数字的时候,有如下规则需要掌握(这些规则来自百度百科):
  (1)基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;
(2)不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;
(3)V 和 X 左边的小数字只能用 Ⅰ;
(4)L 和 C 左边的小数字只能用X;
(5)D 和 M 左边的小数字只能用 C。

知道了这些规则之后,就能知道该如何转换罗马数字了。举个例子,将99转化为罗马数字,乍一看好像是IC,因为右边的大数减去跟着的小数为:C(100) - I(1) = 99,但违反了第4个规则,所以正确的表示方式应该是XCIX,至于为什么不是IXXC,是因为要将大的数放在左边,好了讲了一堆罗马数字的表示规则,该贴出代码看看了。

 

/**
 * Given a roman numeral, covert it to integer.
 */
#include
#include
#include
using namespace std ;

int romanToInt(string s) {
    map romanElement ;
	
	romanElement['I'] = 1 ;
	romanElement['V'] = 5 ;
	romanElement['X'] = 10 ;
	romanElement['L'] = 50 ;
	romanElement['C'] = 100 ;
	romanElement['D'] = 500 ;
	romanElement['M'] = 1000 ;  
	
	int strLength = s.length() ;
	int sum = 0 ;
	
	for( int i = strLength - 1; i >= 0; i--)
	{
		char temp = s.at(i);
		char temp2 ;
		
		if( i - 1 >= 0 )
		{
			temp2 = s.at(i-1) ;
			if( romanElement[temp] > romanElement[temp2] )
			{
				sum += romanElement[temp] - romanElement[temp2] ;
				i-- ;
			}
			else
			{
				sum += romanElement[temp] ;
			}
		}
		else
		{
			sum += romanElement[temp] ;
		}
	}
	return sum ;
}

int main()
{	
	string  s ;
	
	while( s != "n" )
	{
		cin >> s ;
		cout << "The Roman To Integer is : " << romanToInt(s) << endl ;
	}
	return 0 ;
} 

思路很简单,从右往左遍历,遇到比当前符号小的数就减去该数,并将运算后的结果保存下来,由于题目确实很简单,就不再多说了。。。
 

 

你可能感兴趣的:(算法,C/C++)