1. 程式人生 > >[LeetCode][13]Roman to Integer解析 羅馬字元轉int型別關於棧的常數實現-Java實現

[LeetCode][13]Roman to Integer解析 羅馬字元轉int型別關於棧的常數實現-Java實現

Q:

Given a roman numeral, convert it to an integer.

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

A:

以下解法和程式碼沒有借閱以往任何資料,如果有更好的解法請在評論區留言

看到這一題我真是感嘆城會玩,昨天剛剛解過一個int轉羅馬字母,今天又反過來解。自嘆弗如。這題的該意思就是給一個羅馬字元,把他轉化成一個int數字,範圍在1~3999之間。關於羅馬數字的詳細資訊就不復制了,如果有不懂的請移步int轉羅馬數字

首先我們需要知道的是,在int中個位十位百位千位都是隻有一位數字表示的,如1、3、9.但是在羅馬字元中每一位的個數都可能不同如:I、II、III,這就要求我們必須找到一種辦法來區分羅馬的各個位。我們知道很明顯的羅馬數字中的X一出現這一個數字的範圍就在9~13之間,也就是說一但出現了諸如X、C、M這三個字元的,如果在左側沒有一個對應的-1的話(IX,XC,CM),那麼他就代表了進位。其次我們需要知道一個字元的左側只會出現4和9這種情況(IV、IX、XC等)。這樣我們就出現了兩種思路:

1、按照進位計算,跟昨天解決int轉羅馬字元很像。

2、按照從高位到低位相加減運算。

我選擇了2,為什麼呢?因為1中的進位其實很複雜,出了IX這種型別外還有XXX,和L這種情況。所以我們選擇從高位按字元讀取計算更加合適。同樣的我們也可以採用壓棧的方式進行計算,這種計算方法詳見:棧的應用

我們舉個例子,對於157這種數字,羅馬字元表示為CLVII。我們讀取第一個字元的時候壓入棧中。然後繼續讀取是L,因為L<C所以不可能是左減的情況,只能是右加,所以我們用彈出C並+L然後壓入棧中這時棧裡是C+L=150,繼續取V<L所以一樣是右加型別彈棧壓棧得155,之後一樣最後得出157.perfect。

程式碼如下:(這裡順便說一下String型別的基礎是char[]所以使用遍歷的時間複雜度和陣列是一樣的)

public class RomantoInteger {
	public static void main(String[] args){
		String roman = "MCCXXXIV";
		try {
			System.out.println(method(roman));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private static int method(String roman) throws Exception {
		// TODO Auto-generated method stub
		int stack = 0;
		int lastInt = 0;
		for(int i =0;i<roman.length();i++){
			int thisInt = getIntFromRoman(roman.charAt(i));
			if(thisInt>lastInt){//左減
				stack = stack-(lastInt<<1);
			}
			stack = stack+thisInt;
			lastInt = thisInt;
		}
		return stack;
	}
	private static int getIntFromRoman(char roman) throws Exception{//I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。
		int a = 0;
		switch (roman) {
		case 'I':
			a= 1;
			break;
		case 'V':
			a= 5;
			break;
		case 'X':
			a= 10;
			break;
		case 'L':
			a= 50;
			break;
		case 'C':
			a= 100;
			break;
		case 'D':
			a= 500;
			break;
		case 'M':
			a= 1000;
			break;
		default:
			throw new Exception("含有非羅馬字元");
		}
		return a;
	}
}
成功K.O