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

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

相关推荐
2401_838683372 小时前
单元测试在C++项目中的实践
开发语言·c++·算法
keep intensify2 小时前
深度解析TCP三次握手四次挥手
网络·c++·后端·网络协议·tcp/ip·golang
双手插兜-装高手2 小时前
C++设计模式
c++·设计模式
一叶落4382 小时前
【LeetCode 289】生命游戏(C语言)|原地算法 + 状态标记法
c语言·数据结构·算法·leetcode·游戏
星轨初途2 小时前
郑州轻工业大学“筑梯杯” 2025级新生程序设计大赛暨省内高校邀请赛——题解
android·c++·经验分享·笔记·算法
淮南颂恩少儿编程2 小时前
淮南少儿编程 | CSP-J真题详解:在淮南也有接地气的算法课
c++·人工智能·python·深度学习·算法·青少年编程·蓝桥杯
zh路西法2 小时前
【宇树机器人强化学习】(五):go2奖励函数的实现与模型检验
python·深度学习·算法·机器学习·机器人
m0_748873552 小时前
模板编译期排序算法
开发语言·c++·算法
2401_842623652 小时前
基于C++的爬虫框架
开发语言·c++·算法