給定一個羅馬數字,將其轉換成整數。
羅馬數字包含以下七種字符: 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.
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/roman-to-integer
初步分析
- 將各類情況放入哈希表,逐個查詢表中符合的情況。
- 歸納特殊情況加減關係。
本章總結
【小總結】
1.【哈希表的使用】
2.【關係的歸納】
詳細代碼
哈希表版
public class Solution {
public int RomanToInt(string s) {
int sum = 0;
Dictionary<string, int> dic = new Dictionary<string, int>();
dic.Add("I", 1);
dic.Add("IV", 4);
dic.Add("V", 5);
dic.Add("IX", 9);
dic.Add("X", 10);
dic.Add("XL", 40);
dic.Add("L", 50);
dic.Add("XC", 90);
dic.Add("C", 100);
dic.Add("CD", 400);
dic.Add("D", 500);
dic.Add("CM", 900);
dic.Add("M", 1000);
for (int i = s.Length-1; i >=0 ; i--)
{
if (i > 0)
{
if (dic.ContainsKey(s[i - 1].ToString() + s[i].ToString()))
{
sum = sum + dic[s[i - 1].ToString() + s[i].ToString()];
i--;
}
else
sum = sum + dic[s[i].ToString()];
}
else
{
sum = sum + dic[s[i].ToString()];
}
}
return sum;
}
}
關係歸納版
public class Solution {
public int RomanToInt(string s) {
int sum = 0;
int preNum = getValue(s[0]);
for(int i = 1;i < s.Length; i ++) {
int num = getValue(s[i]);
if(preNum < num) {
sum -= preNum;
} else {
sum += preNum;
}
preNum = num;
}
sum += preNum;
return sum;
}
private int getValue(char ch) {
switch(ch) {
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
default: return 0;
}
}
}
位運算符:
(a & b)
按位與運算符:參與運算的兩個值,如果兩個相應位都爲1,則該位的結果爲1,否則爲0
輸出結果 12 ,二進制解釋: 0000 1100
(a | b)
按位或運算符:只要對應的二個二進位有一個爲1時,結果位就爲1。
輸出結果 61 ,二進制解釋: 0011 1101
(a ^ b)
按位異或運算符:當兩對應的二進位相異時,結果爲1
輸出結果 49 ,二進制解釋: 0011 0001
(~a )
按位取反運算符:對數據的每個二進制位取反,即把1變爲0,把0變爲1 。~x 類似於 -x-1
輸出結果 -61 ,二進制解釋: 1100 0011,在一個有符號二進制數的補碼形式。
a << 2
左移動運算符:運算數的各二進位全部左移若干位,由 << 右邊的數字指定了移動的位數,高位丟棄,低位補0。
輸出結果 240 ,二進制解釋: 1111 0000
a >> 2
右移動運算符:把">>"左邊的運算數的各二進位全部右移若干位,>> 右邊的數字指定了移動的位數
輸出結果 15 ,二進制解釋: 0000 1111
賦值運算符:
*= 乘法賦值運算符 c *= a 等效於 c = c * a
/= 除法賦值運算符 c /= a 等效於 c = c / a
%= 取模賦值運算符 c %= a 等效於 c = c % a
**= 冪賦值運算符 c **= a 等效於 c = c ** a
//= 取整除賦值運算符 c //= a 等效於 c = c // a
作者:boywithacoin_cn
鏈接:https://leetcode-cn.com/problems/reverse-integer/solution/pythondan-chu-he-tui-ru-shu-zi-yi-chu-qian-jin-xin/
來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
以下是個人初步版本垃圾代碼僅供參考
public class Solution {
public int RomanToInt(string s) {
Stack<char> stack = new Stack<char>(s.Length);
int sum = 0;
for (int i = s.Length - 1; i >= 0; i--)
{
switch (s[i])
{
case 'I':
{
if (stack.Count==0|| (stack.Peek() != 'V' && stack.Peek() != 'X'))
sum = sum + 1;
else
sum = sum - 1;
break;
}
case 'V':
sum = sum + 5;
break;
case 'X':
{
if (stack.Count == 0 || (stack.Peek() != 'L' && stack.Peek() != 'C'))
sum = sum + 10;
else
sum = sum - 10;
break;
}
case 'L':
sum = sum + 50;
break;
case 'C':
{
if (stack.Count == 0 || (stack.Peek() != 'D' && stack.Peek() != 'M'))
sum = sum + 100;
else
sum = sum - 100;
break;
}
case 'D':
sum = sum + 500;
break;
case 'M':
sum = sum + 1000;
break;
}
stack.Push(s[i]);
}
return sum;
}
}