Roman to Integer (E)
題目
Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:
Ican be placed beforeV(5) andX(10) to make 4 and 9.Xcan be placed beforeL(50) andC(100) to make 40 and 90.Ccan be placed beforeD(500) andM(1000) to make 400 and 900.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: "III"
Output: 3
Example 2:
Input: "IV"
Output: 4
Example 3:
Input: "IX"
Output: 9
Example 4:
Input: "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
Example 5:
Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
題意
將給定的羅馬數字轉化為整數,
思路
羅馬數字的規律是,除了4、9等這類特殊的數字,所有的大數字都在小數字的左邊,當小數排在大數左側時,說明這個小數是需要被減去的,參照此規律,從右往左遍歷字符,如果當前數字比右邊的數字(若存在)小,則需要在總和中減去當前數,否則加上當前數,
代碼實作
Java
class Solution {
public int romanToInt(String s) {
int ans = 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 = s.length() - 1; i >= 0; i--) {
char c = s.charAt(i);
if (i < s.length() - 1 && map.get(c) < map.get(s.charAt(i + 1))) {
ans -= map.get(c);
} else {
ans += map.get(c);
}
}
return ans;
}
}
JavaScript
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function (s) {
let sum = 0
let map = new Map([
['M', 1000],
['D', 500],
['C', 100],
['L', 50],
['X', 10],
['V', 5],
['I', 1],
])
let nums = s.split('').map((c) => map.get(c))
for (let i = 0; i < nums.length; i++) {
let sign = i < nums.length - 1 && nums[i] < nums[i + 1] ? -1 : 1
sum += sign * nums[i]
}
return sum
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/43518.html
標籤:其他
