【LeetCode 12】整数转罗马数字(C语言)| 贪心算法详解

一、题目描述

给定一个整数 num,将其转换为罗马数字。

罗马数字由以下七种字符组成:

符号 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

特殊规则:

  • 4 = IV

  • 9 = IX

  • 40 = XL

  • 90 = XC

  • 400 = CD

  • 900 = CM

输入范围:

复制代码
1 <= num <= 3999

示例:

复制代码
输入:num = 1994
输出:"MCMXCIV"

解释:

复制代码
1000 = M
900  = CM
90   = XC
4    = IV

二、解题思路(贪心算法)

罗马数字的构造遵循一个从大到小逐步匹配 的规则,因此非常适合使用 贪心算法

核心思想:

  1. 预先列出所有可能的罗马数字组合(包括减法规则)

  2. 按照从大到小的顺序遍历

  3. 如果当前数值 num >= values[i]

  4. 就拼接对应的罗马字符,并减去该值

  5. 直到 num 变为 0

例如:

复制代码
num = 1994

匹配过程:

复制代码
1000 -> M      num = 994
900  -> CM     num = 94
90   -> XC     num = 4
4    -> IV     num = 0

最终结果:

复制代码
MCMXCIV

三、C语言代码实现

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* intToRoman(int num) {
    
    int values[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
    
    char* symbols[] = {
        "M","CM","D","CD",
        "C","XC","L","XL",
        "X","IX","V","IV","I"
    };
    
    char* res = (char*)malloc(20 * sizeof(char));
    res[0] = '\0';

    for(int i = 0; i < 13; i++)
    {
        while(num >= values[i])
        {
            strcat(res, symbols[i]);
            num -= values[i];
        }
    }

    return res;
}

四、复杂度分析

时间复杂度

复制代码
O(1)

因为最多只会遍历 13 种罗马符号。


空间复杂度

复制代码
O(1)

只使用了固定大小的辅助空间。


五、优化思路

上面的代码使用了 strcat() 拼接字符串,但 strcat 每次都需要寻找字符串末尾,效率稍低。

可以通过 维护指针直接写入字符数组 来优化,使代码更加高效。


六、总结

本题核心是:

  • 贪心思想

  • 预处理罗马数字组合

  • 从大到小逐步匹配

关键点:

  1. 需要包含 6 种特殊减法规则

  2. 按照 数值从大到小遍历

  3. 每次减去最大可匹配值

这样即可轻松完成整数到罗马数字的转换。

相关推荐
Dlrb12111 天前
C语言-指针三
c语言·算法·指针·const·命令行参数
kkeeper~1 天前
0基础C语言积跬步之深入理解指针(5下)
c语言·开发语言
Tisfy1 天前
LeetCode 2540.最小公共值:双指针(O(m+n))
算法·leetcode·题解·双指针
IronMurphy1 天前
【算法四十七】152. 乘积最大子数组
算法
REDcker1 天前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
basketball6161 天前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
淘矿人1 天前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
Cosolar1 天前
万字详解:RAG 向量索引算法与向量数据库架构及实战
数据库·人工智能·算法·数据库架构·milvus
想唱rap1 天前
IO多路转接之poll
服务器·开发语言·数据库·c++
小江的记录本1 天前
【Java基础】泛型:泛型擦除、通配符、上下界限定(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·mysql·spring·面试·职场和发展