Redis開啟rdb檔案常用方法詳解
阿新 • • 發佈:2020-09-17
1.問題描述
羅馬數字包含以下七種字元: 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
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.
提示:
- 題目所給測試用例皆符合羅馬數字書寫規則,不會出現跨位等情況。
- IC 和 IM 這樣的例子並不符合題目要求,49 應該寫作 XLIX,999 應該寫作 CMXCIX 。
2.求解
常規解法
由題意可總結出以下規律:
- 羅馬數字的小值在大值的左邊時,則大值減去小值。例如
IV = V - I = 4
- 羅馬數字的小值在大值的右邊時,則大值加上小值。例如
VI = V + I = 6
於是我們在每次遍歷時可以取出兩位,查詢他們的大小關係,確定是加還是減。
程式碼如下:
public int romanToInt(String s) {
char[] chars = s.toCharArray();
int sum = 0, preNum = romanToNum(chars[0]);
for (int i = 1; i < chars.length; i++) {
int num = romanToNum(chars[i]);
if (preNum < num) {
sum -= preNum;
} else {
sum += preNum;
}
preNum = num;
}
sum += preNum;
return sum;
}
private int romanToNum(char roman) {
switch (roman) {
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;
}
}
- 時間複雜度 O(n)
- 空間複雜度O(n)
自建雜湊表
雜湊表的本質就是把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。
於是我們可以把第一種方法的switch改成HashMap。
在第一種方法中我們還需要對比前後兩個數的關係,那麼我們也可以將所有的關係列舉到hash表中,每次取出兩個數在hash表中查詢,當查詢不到的時候在取出第一個數進行查詢。
程式碼如下
public int romanToInt(String s) {
Map<String, Integer> map = new HashMap<>();
map.put("I", 1);
map.put("IV", 4);
map.put("V", 5);
map.put("IX", 9);
map.put("X", 10);
map.put("XL", 40);
map.put("L", 50);
map.put("XC", 90);
map.put("C", 100);
map.put("CD", 400);
map.put("D", 500);
map.put("CM", 900);
map.put("M", 1000);
int sum = 0;
for(int i = 0; i < s.length();) {
if (i + 1 < s.length() && map.containsKey(s.substring(i,i+2))){
sum += map.get(s.substring(i,i+2));
i += 2;
}else{
sum += map.get(s.substring(i,i+1));
i++;
}
}
return sum;
}
- 時間複雜度、空間複雜度不變