• Leetcode:整数转罗马数字


    题目链接:12. 整数转罗马数字 - 力扣(LeetCode)

    普通版本(模拟)

    条件分析:罗马数字由 7 个不同的单字母符号组成,每个符号对应一个具体的数值。此外,减法规则还给出了额外的 6 个复合符号,且输入的数字满足1 <= num <= 3999

    解法分析:为了表示一个给定的整数 num,我们寻找不超过 num 的最大符号值,将 num 减去该符号值,然后继续寻找不超过 num 的最大符号值,将该符号拼接在上一个找到的符号之后,循环直至 num 为 0。最后得到的字符串即为 num 的罗马数字表示

    1. class Solution {
    2. public:
    3. string intToRoman(int num) {
    4. int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    5. string reps[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    6. string res;//最终结果
    7. for (int i = 0; i < 13; i++ )
    8. {
    9. while(num >= values[i])
    10. {
    11. num -= values[i];
    12. res += reps[i];
    13. }
    14. }
    15. return res;
    16. }
    17. };

    时间复杂度:O(1)(由于 valueSymbols 长度是固定的,且这 13 字符中的每个字符的出现次数均不会超过 3,因此循环次数有一个确定的上限。对于本题给出的数据范围,循环次数不会超过 15 次)

    空间复杂度:O(1)

    也是普通版本(硬编码)

    由上述内容可得:

    千位数字只能由 M 表示
    百位数字只能由 C,CD,D 和 CM表示
    十位数字只能由 X,XL,L 和 XC 表示
    个位数字只能由 I,IV,V 和 IX表示

    结论:这恰好把这 13 个符号分为四组,且组与组之间没有公共的符号。因此,整数 num的十进制表示中的每一个数字都是可以单独处理的。

    进一步地,我们可以计算出每个数字在每个位上的表示形式,整理成一张硬编码表,利用模运算和除法运算,我们可以得到 num 每个位上的数字(且不违反题目中说的IXCM最多可以附加三次, V、L、D只能被附加一次

    1. const string thousands[] = {"", "M", "MM", "MMM"};
    2. const string hundreds[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
    3. const string tens[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
    4. const string ones[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
    5. class Solution {
    6. public:
    7. string intToRoman(int num) {
    8. return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
    9. }
    10. };

    时间复杂度:O(1)(由于 valueSymbols 长度是固定的,且这 13 字符中的每个字符的出现次数均不会超过 3,因此循环次数有一个确定的上限。对于本题给出的数据范围,循环次数不会超过 15 次)

    空间复杂度:O(1)

    ~over~

  • 相关阅读:
    golang适合做什么
    Mybatis关联关系映射
    享元模式介绍(含案例代码)
    java计算机毕业设计学生健康信息管理源码+系统+mysql数据库+lw文档
    不抖机灵!让工程师来告诉你做芯片是如何烧钱的!
    激活函数之ReLU, GeLU, SwiGLU
    初刷leetcode题目(2)——数据结构与算法
    线上展厅多元运用
    Ajax中form表单以及模版引擎
    【Interaction交互模块】AngularJointDrive角度关节驱动
  • 原文地址:https://blog.csdn.net/m0_73975164/article/details/139415467