leetcode 虐我篇之(九)Roman to Integer

   今晚前面連做了兩道簡單題目後,現在接着做這道AC率高的題目,Roman to Integer,題目描述如下:

Given a roman numeral, convert it to an integer.

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

    一開始題目沒有理解好,以爲給一個string = “123” ,然後將其轉爲int型就好了,結果一提交,發現錯了,題目的輸入真的是羅馬數字,我去,對羅馬數字不是很熟悉啊,知道一到十是怎麼樣的,結果百度百科一下,長見識了,羅馬數字的寫法,特別是幾十幾百幾千的寫法還是挺有意思的。看了百度百科後,再來做這道題,難度就沒什麼了。

    我的解題思路是,字符串從左往右讀取每個字符,判斷字符對應的數是多少,把它加到結果中。這裏面還要考慮一種情況,就是當前字符表示的數要大於它前一個字符表示的數的時候,就要減去前面的數的2倍,因爲剛纔我們把它加了一次,爲了對第一個數也適合循環體裏面的判斷條件,我這裏一開始就定義了prev=1000,因爲題目說不會超過3999,那麼就是不會超過1000,這樣就可以判斷第一個字符的情況了。例如:IV這個數,第一個字符是I,代表的數是1,因爲 1<1000 那麼結果是 result =0 + 1  =1,這時將prev = 1;然後是第二個字符是 V ,代表的數字是5,因爲 5>1,所以結果 result =1 + 5 - 2*1,即 result =  4。 IV = 4。結果沒錯。

    代碼如下:

int romanToInt(string s) 
{
	string::iterator sit = s.begin();

	int result = 0;
	int temp = 0,prev = 1000;	//最大是3999所以這裏取1000就夠了
	while(sit != s.end())
	{
		switch(*sit++)
		{
			case 'M' : temp = 1000;break;
			case 'D' : temp = 500;break;
			case 'C' : temp = 100;break;
			case 'L' : temp = 50;break;
			case 'X' : temp = 10;break;
			case 'V' : temp = 5;break;
			case 'I' : temp = 1;break;
			default: temp = 0;break;
		}
		
		if(temp > prev)
		{
			result += temp - 2*prev; 
		}
		else
		{
			result += temp;
		}

		prev = temp;
		
	}
	return result;
}

    當然了,程序沒有檢查輸入字符是否符合羅馬數字的表示方法。如果要判斷的話,那就真得要研讀一下百度百科中關於羅馬數字的表示方法和一些規則了。有興趣的同學可以試試看。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章