题意:

image.png

解题思路:

  1. 思路:
  2. 1. 将罗马数字字符跟数字做一个映射;
  3. 2. 从前往后扫描,如果s[i+1] > s[i],证明右边的数字比左边要大,
  4. 这时候用0减去左边的数字得到一个差值,再将i向后移动一位,如果s[i+1] < s[i],则直接累积s[i]的值;
  5. 3. 比如IV =》s[i + 1] = 5, s[i] = 1, 得到 0-1 = -1,然后用 -1 + 5 = 4

PHP代码实现:

  1. class Solution {
  2. function romanToInt($s) {
  3. $arr = ['I' => 1, 'V' => 5, 'X' => 10, 'L' => 50,
  4. 'C' => 100, 'D' => 500, 'M' => 1000];
  5. $num = 0; $count = strlen($s);
  6. for ($i = 0; $i < $count; $i++) {
  7. $next = $i + 1;
  8. if ($arr[$s[$next]] > $arr[$s[$i]]) $num -= $arr[$s[$i]];
  9. else $num += $arr[$s[$i]];
  10. }
  11. return $num;
  12. }
  13. }

GO代码实现:

  1. func romanToInt(s string) int {
  2. num := romanMap[s[len(s)-1]]
  3. for i := len(s) - 2; i >= 0; i-- {
  4. if romanMap[s[i]] < romanMap[s[i+1]] {
  5. num -= romanMap[s[i]]
  6. } else {
  7. num += romanMap[s[i]]
  8. }
  9. }
  10. return num
  11. }
  12. var romanMap = map[byte] int {
  13. 'I': 1,
  14. 'V': 5,
  15. 'X': 10,
  16. 'L': 50,
  17. 'C': 100,
  18. 'D': 500,
  19. 'M': 1000,
  20. }