leetCode 13. Roman to Integer 字符串

13. Roman to Integeride


Given a roman numeral, convert it to an integer.spa

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


補充:羅馬數字orm

羅馬數字共有七個,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。按照下面的規則能夠表示任意正整數。blog

重複數次:一個羅馬數字重複幾回,就表示這個數的幾倍。 遞歸


右加左減:在一個較大的羅馬數字的右邊記上一個較小的羅馬數字,表示大數字加小數字。在一個較大的數字的左邊記上一個較小的羅馬數字,表示大數字減少數字。可是,左減不能跨越等級。好比,99不能夠用IC表示,用XCIX表示。 ci


加線乘千:在一個羅馬數字的上方加上一條橫線或者在右下方寫M,表示將這個數字乘以1000,便是原數的1000倍。同理,若是上方有兩條橫線,便是原數的1000000倍。 字符串


單位限制:一樣單位只能出現3次,如40不能表示爲XXXX,而要表示爲XL。input



思路:string

  1. 將字符串分爲3部分,left,mid,right。

  2. 獲取當前字符串的最大單位m。記錄位置,字符。

  3. 獲取最大單位連續出現的次數n。

  4. 經過遞歸,結果爲m*n - 左邊 + 右邊。


代碼以下:

int romanToInt(string s) {
	if (s.size() == 0)
		return 0;
	string left, right;
	map<char, int> romanMap;
	romanMap.insert(pair<char, int>('I', 1));
	romanMap.insert(pair<char, int>('V', 5));
	romanMap.insert(pair<char, int>('X', 10));
	romanMap.insert(pair<char, int>('L', 50));
	romanMap.insert(pair<char, int>('C', 100));
	romanMap.insert(pair<char, int>('D', 500));
	romanMap.insert(pair<char, int>('M', 1000));

	int maxGrade = 0; //最高級
	char maxChar = '\0';
	int maxGrades = 0;//最高級次數
	int maxGradePos = 0; //最高級位置

	for (int i = 0; i < s.size(); i++)//獲取最高級字符,最高級位置
	{
		if (romanMap[s[i]] > maxGrade)
		{
			maxGrade = romanMap[s[i]];
			maxChar = s[i];
			maxGradePos = i;
		}
	}

	for (int i = maxGradePos; i < s.size(); i++)//獲取最高級連續次數
	{
		if (s[i] == maxChar)
			maxGrades++;
		else
			break;
	}
	left = s.substr(0, maxGradePos);
	right = s.substr(maxGradePos + maxGrades);
	return maxGrades * maxGrade - romanToInt(left) + romanToInt(right);
}


參考他人作法:

參考網址:http://blog.csdn.net/feliciafay/article/details/17259547

觀察到羅馬數字和Integer的轉換的小規律是:

IV = 5 -  1 =  (-1) + 5 = 4

VI = 5 + 1 = 5 + 1 = 6

I在V前面,因爲I比V小,因此I被解釋爲負數。

V在I後面,因爲V比I大,因此V給解釋爲整數。

繼續看幾個例子。

VII = 5 + 1 + 1 = 7

IX = (-1) + 10 = 9

因此,能夠一次把輸入字符串掃描一遍,從第一個字符開始,到最後一個字符爲止,一次比較當前字符a和當前字符的下一個字符b。若是a< b ,解釋爲 b - a,不然若是a >= b, 解釋爲a + b。 實際上,因爲每次老是比較2個相鄰的字符,因此是下標是從0開始,到inputstring.length()-2結束。

代碼以下:

class Solution {
public:
    int romanToInt(string s) {
    	int sum = 0;  
        int start = 0;  
  
        char char_arr[] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};  
        int int_arr[] = {1, 5, 10, 50, 100, 500, 1000};  
        std::map<char, int> roman_map;  
        int map_len = sizeof(char_arr)/sizeof(char);   
        for (int i = 0; i< map_len; ++i)   
            roman_map.insert(std::pair<char, int> (char_arr[i], int_arr[i]));  
        for (int i = 0; i < s.length() - 1; ++i) {  
            if (roman_map[s[i]]>=roman_map[s[i + 1]])  
                sum += roman_map[s[i]];  
            else  
                sum -= roman_map[s[i]];  
        }  
        sum += roman_map[s[s.length()-1]];  
        return sum;  
    }
};


2016-08-10 15:44:23

相關文章
相關標籤/搜索