【力扣】13. 罗马数字转整数、12. 整数转罗马数字

简介: 【力扣】13. 罗马数字转整数、12. 整数转罗马数字

罗马数字包含以下七种字符: IVXLCDM

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

例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。


通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。


13. 罗马数字转整数

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

示例 1:

输入: s = “III”

输出: 3

示例 2:


输入: s = “IV”

输出: 4


示例 3:


输入: s = “IX”

输出: 9


示例 4:


输入: s = “LVIII”

输出: 58

解释: L = 50, V= 5, III = 3.


示例 5:


输入: s = “MCMXCIV”

输出: 1994

解释: M = 1000, CM = 900, XC = 90, IV = 4.


提示:

  • 1 <= s.length <= 15
  • s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
  • 题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999]
  • 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
  • ILIM 这样的例子并不符合题目要求,49 应该写作 XLIX999 应该写作 CMXCIX
  • 关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。


解决方案

  • C
int getvalue(char ch)
{
    switch(ch) 
    {
        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;
    }
}

int romanToInt(char * s) {
    int sum = 0, num = 0, pre = 0;
    int size = strlen(s);

    pre = getvalue(s[0]);
    for(int i = 1; i < size; i++)
    {
        num = getvalue(s[i]);
        if(pre < num)
        {
            sum -= pre;
        }
        else
        {
            sum += pre;
        }
        pre = num;
    }
    sum += pre;
    return sum;
}



12. 整数转罗马数字

给你一个整数,将其转为罗马数字。

示例 1:

输入: num = 3

输出: “III”

示例 2:

输入: num = 4

输出: “IV”


示例 3:


输入: num = 9

输出: “IX”


示例 4:


输入: num = 58

输出: “LVIII”

解释: L = 50, V = 5, III = 3.


示例 5:


输入: num = 1994

输出: “MCMXCIV”

解释: M = 1000, CM = 900, XC = 90, IV = 4.


提示:


1 <= num <= 3999

解题方案

  • C 暴力破解
// 暴力破解
// 暴力破解
char* intToRoman(int num) {

    char* M[4] = {"", "M", "MM", "MMM"}; // 1000,2000,3000
    char* C[10] = {"",  "C",  "CC",  "CCC",  "CD",
                   "D", "DC", "DCC", "DCCC", "CM"}; // 100~900
    char* X[10] = {"",  "X",  "XX",  "XXX",  "XL",
                   "L", "LX", "LXX", "LXXX", "XC"}; // 10~90
    char* I[10] = {"",  "I",  "II",  "III",  "IV",
                   "V", "VI", "VII", "VIII", "IX"}; // 1~9

    char* result = (char*)malloc(32 * sizeof(char));
    memset(result, 0, 32 * sizeof(char));

    strcat(result, M[num / 1000]);
    strcat(result, C[(num % 1000) / 100]);
    strcat(result, X[(num % 100) / 10]);
    strcat(result, I[num % 10]);

    return result;
}


  • C 模拟
char* intToRoman(int num) {
    int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    char* tab[] = {"M",  "CM", "D",  "CD", "C",  "XC", "L",
                   "XL", "X",  "IX", "V",  "IV", "I"};
    char* result = malloc(sizeof(char) * 32);
    result[0] = '\0';
    for (int i = 0; i < 13; i++) {
        while (num >= values[i]) {
            num -= values[i];
            strcpy(result + strlen(result), tab[i]);
        }
        if (num == 0) {
            break;
        }
    }
    return result;
}


相关文章
|
1月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
79 2
|
1月前
|
算法
LeetCode第12题目整数转罗马数字
该文章介绍了 LeetCode 第 12 题整数转罗马数字的解法,通过使用 TreeMap 按照整数从大到小排序,先使用大的罗马数字表示整数,再用小的,核心是先表示完大的罗马数字,想通此点该题较简单。
LeetCode第12题目整数转罗马数字
|
1月前
|
算法
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)
|
1月前
|
算法
LeetCode第7题整数反转
该文章介绍了 LeetCode 第 7 题整数反转的解法,通过除 10 取模和乘 10 累加的方式实现整数反转,同时注意边界情况的判断,并总结了通过举例推算发现规律的解题思路。
LeetCode第7题整数反转
|
1月前
|
算法
LeetCode第13题目罗马数字转整数
该文章介绍了 LeetCode 第 13 题罗马数字转整数的解法,通过从大到小解析罗马数字,根据罗马数字的特点,按照从大到小的顺序匹配罗马数字和整数的关系,从而解决该问题,同时强调要注意观察题目考查的知识点特征。
|
1月前
|
Python
【Leetcode刷题Python】343. 整数拆分
LeetCode 343题 "整数拆分" 的Python解决方案,使用动态规划算法来最大化正整数拆分为多个正整数之和的乘积。
15 0
|
3月前
|
算法
力扣经典150题第十八题:整数转罗马数字
力扣经典150题第十八题:整数转罗马数字
20 0
|
3月前
|
存储 算法 测试技术
力扣经典150题第十七题:罗马数字转整数
力扣经典150题第十七题:罗马数字转整数
34 0
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
42 6
|
1月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
37 7