思路:
遍历字符串,比较当前罗马字符与后一个罗马字符对应的十进制数字的大小。
如果大于,则将该数字累加到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)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getValue(char c)
{
switch (c)
{
case 'M':
return 1000;
break;
case 'D':
return 500;
break;
case 'C':
return 100;
break;
case 'L':
return 50;
break;
case 'X':
return 10;
break;
case 'V':
return 5;
break;
case 'I':
return 1;
break;
default:
return -1;
break;
}
}
int romanToInt(char *str)
{
int k = 0;
int num = 0;
while (str[k] != '\0')
{
int numCurt = getValue(str[k]);
// 判断下一个字符是否是空字符,防止字符串越界
// 如果是空字符,就将其下标与前一个字符的下标置为一样
int numNext = str[k + 1] != '\0' ? getValue(str[k + 1]) : numCurt;
if (numCurt < numNext)
{
num += numNext - numCurt;
k += 2;
}
else
{
num += numCurt;
k++;
}
}
return num;
}
int main(void)
{
char *str = "MCMXCIV";
printf("%d\n", romanToInt(str));
}
方法二、将罗马数字与十进制数字作为键值对存储在哈希表中,然后其他步骤和方法一一样。
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) {
let numCurt = intRoman[s[i]]
let numNext = i + 1 < len ? intRoman[s[i + 1]] : intRoman[s[i]]
if (numCurt < numNext) {
num += numNext - numCurt;
i += 2;
} else {
num += numCurt;
i++;
}
}
return num;
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。