1. 程式人生 > >leetcode-13-羅馬數字轉整數(roman to integer)-java

leetcode-13-羅馬數字轉整數(roman to integer)-java

題目及測試

package pid013;
/*羅馬數字轉整數

羅馬數字包含以下七種字元: I, V, X, L,C,D 和 M。

字元          數值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 羅馬數字 2 寫做 II ,即為兩個並列的 1。12 寫做 XII ,即為 X + II 。 27 寫做  XXVII, 即為 XX + V + II 。

通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 IIII,而是 IV。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 IX。這個特殊的規則只適用於以下六種情況:

    I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
    X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。 
    C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。

給定一個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 的範圍內。

示例 1:

輸入: "III"
輸出: 3

示例 2:

輸入: "IV"
輸出: 4

示例 3:

輸入: "IX"
輸出: 9

示例 4:

輸入: "LVIII"
輸出: 58
解釋: L = 50, V= 5, III = 3.

示例 5:

輸入: "MCMXCIV"
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.



*/


public class main {
	
	public static void main(String[] args) {
		String [] testTable = {"III","IV","IX","LVIII","MCMXCIV"};
		for (String ito : testTable) {
			test(ito);
		}
	}
		 
	private static void test(String ito) {
		Solution solution = new Solution();
		int rtn;
		long begin = System.currentTimeMillis();
		System.out.print(ito);		    
		System.out.println();
		//開始時列印陣列
		
		rtn= solution.romanToInt(ito);//執行程式
		long end = System.currentTimeMillis();	
		
		System.out.println("rtn=" );
		System.out.print(rtn);
		System.out.println();
		System.out.println("耗時:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}

}

解法1(成功,116ms,速度較慢)
直接得到當前的char,將char轉為對應的數字,將now與prev對比,如果now大,說明是4或9,result=result+now-2prev;(4=1+5-21)
否則+now,然後prev=now

package pid013;

import java.math.BigInteger;
import java.util.Arrays;

import javax.sql.rowset.CachedRowSet;

public class Solution {
public int romanToInt(String s) {
    int result=0;
    int length=s.length();
    if(length==0){
    	return 0;
    }
    int index=0;
    char nowChar=s.charAt(index);
    int now=0;
    int prev=0;
    while(true){
    	switch (nowChar) {
		case 'I':
			now=1;
			break;
		case 'V':
			now=5;
			break;
		case 'X':
			now=10;
			break;
		case 'L':
			now=50;
			break;
		case 'C':
			now=100;
			break;
		case 'D':
			now=500;
			break;
		case 'M':
			now=1000;
			break;	
		default:
			return result;
		}
    	if(prev<now){
    		result=result+now-2*prev;
    	}
    	else{
    		result=result+now;
    	}
    	index++;
    	if(index==length){
    		return result;
    	}
    	prev=now;
    	nowChar=s.charAt(index);
    }
	
    }
	

}

解法2(別人的)
把switch換為map,應該可以快一點

public static int romanToInt(String s) {
        char[] c = s.toCharArray();
        int a = 0;
        Map<Character, Integer> map = new HashMap<>();
        map.put('I', 1);
        map.put('V', 5);
        map.put('X', 10);
        map.put('L', 50);
        map.put('C', 100);
        map.put('D', 500);
        map.put('M', 1000);
        for (int i = 0; i < s.length(); ++i) {
            int val = map.get(c[i]);
            if (i == c.length - 1 || map.get(c[i + 1]) <= map.get(c[i])) {
                a += val;
            } else {
                a -= val;
            }
        }
        return a;
    }

解法3(別人的)
只有在IXC的情況下才考慮prev 又可以快一點

public static int romanToInt(String s) {
  String[] strings = s.split("");
        for (int i = 0; i < strings.length; i++) {
            switch (strings[i]) {
                case "I": {
                    int b = a;
                    if (i!=strings.length-1 && strings[i + 1].equals("V")) a += 4;
                    if (i!=strings.length-1 && strings[i + 1].equals("X")) a += 9;
                    if (a != b) i++;
                    else a+= count(strings[i]);
                    break;
                }
                case "X": {
                    int b = a;
                    if (i!=strings.length-1 && strings[i + 1].equals("L")) a += 40;
                    if (i!=strings.length-1 && strings[i + 1].equals("C")) a += 90;
                    if (a != b) i++;
                    else a+= count(strings[i]);
                    break;
                }
                case "C": {
                    int b = a;
                    if (i!=strings.length-1 && strings[i + 1].equals("D")) a += 400;
                    if (i!=strings.length-1 && strings[i + 1].equals("M")) a += 900;
                    if (a != b) i++;
                    else a+= count(strings[i]);
                    break;
                }
                default:
                    a += count(strings[i]);
                    break;
            }
        }
    }
private static int count(String s) {
        if(s.equals("I")) return 1;
        if(s.equals("V")) return 5;
        if(s.equals("X")) return 10;
        if(s.equals("L")) return 50;
        if(s.equals("C")) return 100;
        if(s.equals("D")) return 500;
        return 1000;
}