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

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

相关推荐
赫瑞9 分钟前
数据结构中的排列组合 —— Java实现
java·开发语言·数据结构
大熊背14 分钟前
ISP Pipeline中Lv实现方式探究之三--lv计算定点实现
数据结构·算法·自动曝光·lv·isppipeline
初夏睡觉38 分钟前
c++1.3(变量与常量,简单数学运算详解),草稿公放
开发语言·c++
升职佳兴1 小时前
C盘爆满自救:3步无损迁移应用数据到E盘(含回滚)
c语言·开发语言
西岸行者1 小时前
BF信号是如何多路合一的
算法
阿拉斯攀登1 小时前
从入门到实战:CMake 与 Android JNI/NDK 开发全解析
android·linux·c++·yolo·cmake
大熊背1 小时前
ISP Pipeline中Lv实现方式探究之一
算法·自动白平衡·自动曝光
罗西的思考2 小时前
【OpenClaw】通过 Nanobot 源码学习架构---(5)Context
人工智能·算法·机器学习
Liudef062 小时前
后量子密码学(PQC)深度解析:算法原理、标准进展与软件开发行业的影响
算法·密码学·量子计算
Zarek枫煜3 小时前
C3 编程语言 - 现代 C 的进化之选
c语言·开发语言·青少年编程·rust·游戏引擎