思路:
遍历字符串,比拟以后罗马字符与后一个罗马字符对应的十进制数字的大小。
如果大于,则将该数字累加到num,如果小于,则求出他们的差值,并将其累加到num。
遍历完结,将num返回即可。

第一版、没有应用哈希表,应用数组模仿

#include <stdio.h>#include <stdlib.h>#include <string.h>int getIndex(char *str, char c) {  int k = 0;  while (str[k] != '\0')  {    if (str[k] == c)     {      return k;    }    k++;  }  return -1;}int romanToInt(char *str){  int numArr[] = {1000, 500, 100, 50, 10, 5, 1};  char roman[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};  int k = 0;  int num = 0;  while (str[k] != '\0') {    int indexCurt = getIndex(roman, str[k]);    // 判断下一个字符是否是空字符,避免字符串越界    // 如果是空字符,就将其下标与前一个字符的下标置为一样    int indexNext = str[k + 1] != '\0' ? getIndex(roman, str[k + 1]) : indexCurt;    if (numArr[indexCurt] < numArr[indexNext])    {      num += numArr[indexNext] - numArr[indexCurt];      k += 2;    } else {      num += numArr[indexCurt];      k++;    }  }  return num;}int main(void) {  char *str = "MCMXCIV";  printf("%d\n", romanToInt(str));}

工夫复杂度: O(1)
空间复杂度: O(1)

办法二、将罗马数字与十进制数字作为键值对存储在哈希表中,而后其余步骤和办法一一样。

js实现

/** * @param {string} s * @return {number} */var romanToInt = function(s) {    let intRoman = {        "M": 1000,        "D": 500,        "C": 100,        "L": 50,        "X": 10,        "V": 5,        "I": 1    };    let len = s.length;    let i = 0;     let num = 0;    while (i < len) {        if (intRoman[s[i]] < intRoman[s[i + 1]]) {            num += intRoman[s[i + 1]] - intRoman[s[i]];            i += 2;        } else {            num += intRoman[s[i]];            i++;        }    }    return num;};