跳到主要内容

罗马数字转整数

· 阅读需 4 分钟
Eureka X
Mr.Nobody

力扣面试经典——13题

💡 参考代码:

/**
* 将罗马字符转换为对应的整数值
* @param c - 输入的罗马数字字符,应为 I, V, X, L, C, D, M 中的一个
* @return 对应的整数值,如果输入无效则返回 0
* 'I' -> 1
* 'V' -> 5
* 'X' -> 10
* 'L' -> 50
* 'C' -> 100
* 'D' -> 500
* 'M' -> 1000
* 其他 -> 0
*/
int romanCharToInt(char c) {
switch(c) {
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;
}
}

/**
* 将罗马数字字符串转换为对应的整数
* 罗马数字的规则:
* 1. 通常情况下,较小的数字在较大数字的右边,表示相加
* 2. 特殊情况下,较小的数字在较大数字的左边,表示相减
* 六种减法情况:IV(4), IX(9), XL(40), XC(90), CD(400), CM(900)
*
* @param s - 输入的罗马数字字符串,应为有效的罗马数字格式
* @return 对应的整数值
*
* 算法思路:
* 从左到右遍历字符串,比较当前字符与下一个字符的数值大小:
* - 如果当前字符数值小于下一个字符数值,则执行减法操作
* - 否则执行加法操作
*
* 时间复杂度:O(n),其中 n 是字符串长度
* 空间复杂度:O(1)
*/
int romanToInt(char* s) {
int result = 0;
int len = strlen(s);

for (int i = 0; i < len; i++) {
// 获取当前字符和下一个字符对应的数值
// 如果是最后一个字符,则下一个字符值为0
int current = romanCharToInt(s[i]);
int next = (i < len - 1) ? romanCharToInt(s[i + 1]) : 0;

// 如果当前字符数值小于下一个字符数值,说明是减法情况(如 IV, IX 等)
// 需要从结果中减去当前字符的值
if (current < next) {
result -= current;
} else {
// 正常情况,将当前字符的值加到结果中
result += current;
}
}

return result;
}

📖 总结:

点击展开题目总结

🤔 罗马数字转整数


1️⃣ 题目核心信息

🎯 功能描述:将给定的罗马数字字符串转换为对应的整数值,处理罗马数字的特殊减法规则

📥 输入输出

  • 输入:char* s - 有效的罗马数字字符串,包含字符 I, V, X, L, C, D, M
  • 输出:int - 对应的整数值

2️⃣ 实现原理

💡 核心思路:通过比较相邻字符的数值大小来判断是加法还是减法规则,从左到右遍历字符串进行累加计算

📋 实现步骤

  1. 建立罗马字符到整数值的映射关系
  2. 从左到右遍历罗马数字字符串
  3. 比较当前字符与下一个字符的数值大小
  4. 如果当前字符值小于下一个字符值,则执行减法;否则执行加法

3️⃣ 关键点解析

🎯 代码技巧

  • 使用三元运算符处理边界情况:当访问到最后一个字符时,下一个字符值设为0
  • 通过比较相邻元素大小来统一处理加法和减法规则
  • 使用switch语句快速映射字符到数值

4️⃣ 使用场景

✅ 适用情况:

  • 罗马数字转换程序
  • 历史文献中的数字解析
  • 教学演示罗马数字规则

⚠️ 前提条件:

  • 输入字符串必须是有效的罗马数字格式
  • 字符串只包含合法的罗马数字字符 I, V, X, L, C, D, M

5️⃣ 复杂度分析

  • ⏱️ 时间复杂度:O(n),其中 n 是字符串长度,需要遍历一次字符串

  • 💾 空间复杂度:O(1),只使用了常数级别的额外空间

6️⃣ 注意事项

🚩 边界情况:

  • 空字符串或NULL指针
  • 只有一个字符的罗马数字
  • 最后一个字符的处理

💥 易错点:

  • 忘记处理减法规则的特殊情况
  • 数组越界访问下一个字符
  • 没有正确处理字符串边界条件
加载评论中...