【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. 每次减去最大可匹配值

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

相关推荐
find1star4 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing4 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21124 小时前
力扣160 21 86
算法·leetcode·职场和发展
Tairitsu_H5 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
小智老师PMP6 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN6 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218316 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤7 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate7 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran8 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分