力扣13 羅馬數字轉為整數
題目:
羅馬數字包含以下七種字符: 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:
輸入: s = "III"
輸出: 3
示例 2:
輸入: s = "IV"
輸出: 4
示例 3:
輸入: s = "IX"
輸出: 9
示例 4:
輸入: s = "LVIII"
輸出: 58
解釋: L = 50, V= 5, III = 3.
示例 5:
輸入: s = "MCMXCIV"
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.
解題思路:
根據題意知道:如果羅馬數字從左到右依次是按照數值從小到大(<=)的順序的話則將羅馬符號對應的數值相加的和就是它對應的整數值,如果后一個羅馬符號的數值大于前一個羅馬符號的數值則用后一個羅馬符號的數值-前一個羅馬符號的數值,
代碼:
import java.util.HashMap;
/**
* 將一個羅馬數字轉換為整數
*/
public class LuoMaToInt {
public static void main(String[] args) {
String str = "IVX";
System.out.println("luoMaToInt(str) = " + luoMaToInt(str));
}
//定義一個方法回傳羅馬符號的整數值 回傳值型別為Int 引數型別為String
public static int luoMaToInt(String str){
//1.定義一個hashmap將羅馬符號以及對應的數值存盤起來
HashMap<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);
//2.將字串轉化為陣列有助于提高速度
char[] chars = str.toCharArray();
//3.開始將字串的第一個羅馬數字對應的數值作為結果
int result = map.get(chars[0]);
//4.回圈陣列并累加
for (int i = 1; i < chars.length; i++) {
//5.前一個羅馬符號的數值
Integer pre = map.get(chars[i - 1]);
//6.當前羅馬符號的數值
Integer cur = map.get(chars[i]);
//7.如果當前羅馬符號的數值大于前一個羅馬符號的數值那么就用當前羅馬符號的數值減去前一個羅馬符號的數值否則就直接相加
if(pre < cur){
result += cur - 2*pre;
//因為result有前一個羅馬符號的數值所以當前cur - 2*pre 就整體相當于 cur - pre
}else {
result += cur;
}
}
return result;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/539246.html
標籤:其他
上一篇:根據前序和中序遍歷重建二叉樹
