罗马数字转整数
· 阅读需 4 分钟
力扣面试经典——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️⃣ 实现原理
💡 核心思路:通过比较相邻字符的数值大小来判断是加法还是减法规则,从左到右遍历字符串进行累加计算
📋 实现步骤:
- 建立罗马字符到整数值的映射关系
- 从左到右遍历罗马数字字符串
- 比较当前字符与下一个字符的数值大小
- 如果当前字符值小于下一个字符值,则执行减法;否则执行加法
3️⃣ 关键点解析
🎯 代码技巧
- 使用三元运算符处理边界情况:当访问到最后一个字符时,下一个字符值设为0
- 通过比较相邻元素大小来统一处理加法和减法规则
- 使用switch语句快速映射字符到数值
4️⃣ 使用场景
✅ 适用情况:
- 罗马数字转换程序
- 历史文献中的数字解析
- 教学演示罗马数字规则
⚠️ 前提条件:
- 输入字符串必须是有效的罗马数字格式
- 字符串只包含合法的罗马数字字符 I, V, X, L, C, D, M
5️⃣ 复杂度分析
-
⏱️ 时间复杂度:O(n),其中 n 是字符串长度,需要遍历一次字符串
-
💾 空间复杂度:O(1),只使用了常数级别的额外空间
6️⃣ 注意事项
🚩 边界情况:
- 空字符串或NULL指针
- 只有一个字符的罗马数字
- 最后一个字符的处理
💥 易错点:
- 忘记处理减法规则的特殊情况
- 数组越界访问下一个字符
- 没有正确处理字符串边界条件
加载评论中...