12. Integer to Roman

TMS320F28377D双核开发例程 - DSP开发 首先,我们需要创建一个新的工程来进行开发。然后,选择适当的目标设备为TMS320F28377D,并设置工程的名称和存储位置。在上面的代码中,我们定义了一个128个元素的输入数组和输出数组。然后,我们使用一个简单的数字信号处理算法,将输入数组中的每个元素平方,并将结果存储到输出数组中。这个芯片的双核架构提供了更高的计算能力和灵活性,使得数字信号处理的开发更加高效和可靠。希望本文对您有所帮助!当应用程序在TMS320F28377D芯片上运行时,它将对输入数组中的每个元素进行平方运算,并将结果打印出来。 阅读详情

12. Integer to Roman
Difficulty: Medium

Given an integer, convert it to a roman numeral. Input is guaranteed
to be within the range from 1 to 3999.
给定一个整数,转化为罗马数字。输入的数字范围为1~3999.

重点
罗马数字与整数之间的转换规则:

  1. 左减右加,IV=4=5-1
  2. 左减不能跨越一个位数,99=90+9=XCIX(正确), =100-1=IC(错误)
  3. 左减不能超过1位,8=VIII(正确), =10-1-1=IIX(错误)
  4. 右加不能超过3位,14=10+4=XIV(正确), =10+1+1+1+1=XIIII(错误)
  5. 左减数字仅限于I,X,C,45=40+5=XLV(正确), =50-5=VL(错误)
  6. L不能左减I,D不能左减X,所以
    49=40+9=XLIX(正确), =50-1=IL(错误)
    490=400+90=CDXC(正确), =500-10=XD(错误)

解法1
缺点:逻辑复杂,不容易理解,代码冗长,特殊情况太多,不适用。

const int Count = 7;
const int roman[Count] = { 1, 5, 10, 50, 100, 500, 1000 };
const string str_roman[Count] = {"I","V","X","L","C","D","M"};

class Solution {
private:
    int CalcNums(int a);

public:
    string intToRoman(int num);
};

//计算并返回整数a的位数
int Solution::CalcNums(int a)
{
    int nums = 0;
    while (a > 0)
    {
        a /= 10;
        nums++;
    }
    return nums;
}
//整数转为罗马数字
string Solution::intToRoman(int num) 
{
    string str;
    if (num <= 0)
    {
        return str;
    }
    if(num==49)
    {
        return "XLIX";
    }
    else if(num==490)
    {
        return "CDXC";
    }
    int note = 0;
    int sign = 0;
    int temp;

    while (note < Count)
    {
        if (num <= roman[note])
            break;
        note++;
    }

    if (note == Count)  //大于1000,相加
    {
        sign = 1;
    }
    else if (num == roman[note])  //已经找到
    {
        str = str_roman[note];
        return str;
    }

    if (roman[note] - roman[note - 1] > num) //减一次仍太大(左减不能超过1位),只能相加
    {
        sign = 1;
    }

    if (sign == 0)  //相减
    {
        temp = roman[note] - num;
        for (int k = note - 1; k >= 0; k--)
        {
            if (temp == roman[k])
            {
                int n1 = CalcNums(roman[note]);
                int n2 = CalcNums(roman[k]);
                if ((n1 - n2 > 1)||(k!=0 && k!=2 && k!=4))  //左减不能跨越一个位数,左减的数字仅限于I、X、C,否则只能相加
                {
                    sign = 1;
                    break;
                }
                else
                {
                    str = str_roman[k];
                    str += str_roman[note];
                    return str;
                }               
            }
            else if (temp > roman[k]) //找不到可以左减的值,只能相加
            {
                sign = 1;
                break;
            }
        }
    }
    if (sign == 1) //相加
    {
        int k = 0;
        temp = num;     
        while (k < 3)   //检查是否可由相同数字相加得到(右加不能超过3位)
        {
            temp -= roman[note - 1];
            k++;
            if (temp < 0)
                break;
            if (temp == 0)
            {
                for (int i = 0; i < k; i++)
                {
                    str += str_roman[note - 1];
                }
                return str;
            }
        }
        int n = CalcNums(num);   //不同数字相加
        if (n == 1)  //只有1位,整数6-8
        {
            str = "V";
            num -= 5;
            while (num > 0)
            {
                str += "I";
                num--;
            }
        }
        else   //两位以上
        {
            int sep1;
            int sep2;
            temp = num % (int)pow(10, n - 1);
            if (temp == 0)
            {
                sep1 = roman[note - 1];
                sep2 = num - sep1;
                str = str_roman[note - 1];
                str += intToRoman(sep2);  //递归
            }
            else
            {
                sep2 = num % (int)pow(10, n - 1);  //分成两部分
                sep1 = num - sep2;
                str = intToRoman(sep1);  //递归
                str += intToRoman(sep2);  //递归
            }                   
        }
        return str;
    }
    return str;
}

解法2
优点:逻辑清晰,简洁
思路:化减为加

基本数字:
I—-1
V—5
X—10
L—50
C—100
D—500
M—1000

根据规则2,3,5,6,可以左减的搭配为
IV—-4
IX—-9
XL—40
XC—90
CD—400
CM—900

扩展为13个基本数字,且基本数字之间组合相加可以得到结果,不需要再考虑相减的情况。
根据贪心算法,每次求最优解,每次匹配最大值

class Solution {
public:
    string intToRoman(int num);
};

const int roint[13]={1000,900,500,400,100,90,50,40,10,9,5,4,1};  //化减为加
const string rostr[13]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
string Solution::intToRoman(int num)
{
    string ret;
    int i=0;
    //贪心算法,每次匹配最大值
    while(num>0)
    {
        if(num>=roint[i])
        {
            num-=roint[i];
            ret+=rostr[i];
        }
        else
        {
            i++;
        }
    }
    return ret;
}

问题扩展:罗马数字转数字,范围为1~3999。
(另外一篇博客有过解答,这里提供更简洁的方法)
思路:比右边大,为 +;比右边小,为 - 。

class Solution {
private:
    int funTrans(char c);
public:
    int romanToInt(string s) {

        int num=0;
        int i;
        for(i=0;i<s.size()-1;i++)
        {
            if(funTrans(s[i])>=funTrans(s[i+1]))  //比右边大,为+
            {
                num+=funTrans(s[i]);
            }
            else                                  //比右边小,为 -
            {
                num-=funTrans(s[i]);
            }
        }
        num+=funTrans(s[i]);
        return num;
    }
};

int Solution::funTrans(char c)   //也可以用hash表代替
{
    int num;
    switch(c)
    {
        case 'I':return 1;
        break;
        case 'V':return 5;
        break;
        case 'X':return 10;
        break;
        case 'L':return 50;
        break;
        case 'C':return 100;
        break;
        case 'D':return 500;
        break;
        case 'M':return 1000;
        break;
        default:return 0;
    }
}
《网络信息制作与发布》实训全流程:从专题策划、网站构建到前端实现与上线发布 本文详细介绍了WEB设计专题网站从策划到发布的全流程。主要内容包括:1.网络专题设计(确定主题、编写策划方案、素材搜集整理);2.网站结构构建(设计二级栏目、绘制布局图);3.艺术设计(配色方案、版式设计);4.网页制作(使用Dreamweaver进行标准化布局);5.信息发布(通过Dreamweaver和CuteFTP上传文件、网站维护与备份)。以"学习WEB设计"专题为例,采用框架结构,包含20余个栏目,使用深灰和蓝色为主色调。文章提供了完整的操作步骤和技术要点,适用于网站开发学习者 阅读详情

相关推荐

034、特定场景优化(一):小目标检测的改进策略合集

本文针对工业场景中的小目标检测难题,提出了一套实战优化方案。首先从数据层面建议保持高分辨率输入(1024-1280像素)或采用切块训练策略,并适当放大标注区域。在网络结构上,提出减少下采样次数、增加高分辨率检测头、引入空间注意力机制等改进。损失函数方面推荐使用NWD匹配和QFL损失提升小目标敏感度。部署环节强调NMS优化、分辨率对齐和量化处理技巧。最后总结核心经验:优先优化数据质量而非模型结构,标注一致性比算法更重要,同时需为实际部署预留性能余量。硬件升级有时比算法调优更经济有效。

xiaoyaohou11的博客 652

LeetCode 12 Integer to Roman题解

题目地址: https://leetcode.com/problems/integer-to-roman/ 题目: Given an integer, convert it to a roman numeral. 给定一个数,将它转化为罗马数值。 Input is guaranteed to be within the range from 1 to 3999.

赞美月亮的专栏 634

BODAS说明书的中文版与相关资料总结

花了三天时间配了控制器的接线口,找了软件安装的一套东西。 又花了一周时间零零散散在网上只找到关于控制器少得可怜的资料: 1.力士乐控制器RC6系列介绍 2.力士乐控制器手册不完整版 3.RC6-9程序下载 力士乐配套的只有德语和英语两版,人工翻译专业文件的价格太惊人,决定自己写一版方便大家。有不正之处欢迎指出。 For these controllers, in the event of an...

我的技术日常 6493

12、Integer to Roman

解法一 /** * @param {number} num * @return {string} */ var intToRoman = function(num) {     let roman='';     if(Math.floor(num/1000) &gt;=1 ){ // 比1000大         for (let i=0;i&lt;Math.floor(num/1000);i...

sunmagine的博客 215

从零到一:构建嵌入式Arm-Linux的Qt MQTT通信框架全指南

本文详细指导如何在嵌入式Arm-Linux平台上从零构建Qt MQTT通信框架,涵盖交叉编译、环境配置、依赖库管理及性能优化。重点针对32位Arm架构,提供完整的工具链配置、编译步骤和实战部署方案,适用于物联网和工业控制等场景。

w8x9y0z1的博客 1000

MySQL 8.0数据库崩了别慌!手把手教你仅凭一个.ibd文件找回数据(附Go工具包)

本文详细介绍了在MySQL 8.0数据库崩溃后,如何仅凭.ibd文件恢复数据的完整流程。通过使用Go语言工具包和ALTER TABLE技巧,即使没有备份也能实现数据重生。文章包含从环境准备到数据验证的全方位指导,帮助DBA和开发者应对紧急数据恢复场景。

weixin_29235923的博客 419

12. Integer to Roman。

今天刚开始看《数学之美》在其中有提到数字的起源,当看到关于罗马数字的介绍,终于解开了多年的困惑,为什么IV是4而VI是5。。。之前一直是死记硬背的,现在终于搞明白了缘由。书中的介绍:但其中介绍的也并不是很详细,以下内容摘自百度百科: (1)相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3; (2)小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=

繁城落叶 566

JLINK/SWD/STLINK下载选项区别

摘要: 本文对比了JLINK/SWD/STLINK的6种下载模式:Normal(硬件复位)、Hot plug(无复位)、Under reset(持续复位后连接)、Software reset(软件复位)、Hardware reset(全复位)和Core reset(内核复位)。重点分析了各模式的操作逻辑、适用场景及注意事项,其中Under reset模式是解决SWD禁用/程序异常的首选方案。通过对比表归纳了复位范围、NRST操作等核心差异,并给出场景选择建议:排查连接问题优先选Under reset,常规调

亚洲程序员盟主得博客 395

[LeetCode] 12. Integer to Roman

Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999.枚举。。class Solution { private String getThousand(int thousands){ switch (thousands)...

Nayido的博客 268

71、机器人与机器人控制器技术解析

本文深入解析了机器人控制器的通信接口、传感器数据采集与处理以及抓手技术三大核心技术。详细介绍了数字I/O、串行接口、总线系统和以太网等通信方式,探讨了各类传感器在焊接、装配、质量检测等场景中的应用,并阐述了手眼校准与路径校正的关键方法。同时,文章还分析了不同类型抓手的特点及选型设计原则,展示了机器人在现代工业自动化中的高效性与灵活性。通过实际编程示例与流程图,全面呈现了机器人系统的集成与控制逻辑。

gin88的博客 275

YOLOv11 改进 - Mamba | 集成Mamba-YOLO(AAAI 2025),Mamba-YOLOv11-B 替换骨干,破解全局依赖建模难题,实现高效实时检测

本文介绍Mamba YOLO,为图片物体识别提供了“又快又准”的新方案。传统CNN架构运行快但难以捕捉远距离关联物体,Transformer架构精度高但计算量呈平方级增长,而SSM虽计算量为线性级且能抓全局关联,但用于图片识别时细节定位不准。为此,Mamba YOLO做了三项关键优化:引入ODMamba骨干网络,解决自注意力的二次复杂度问题,且无需预训练;设计ODMamba宏观结构确定最佳阶段比例和缩放大小;采用多分支结构的RG块建模通道维度,解决SSM在序列建模中的不足。在COCO数据集测试中,其小版本推

魔改工程师的博客 857

leetcode 12 Integer to Roman

数字转换为罗马数字

ghoshorn的专栏 403

SillyTavern本地AI聊天平台部署与调优全指南

大型语言模型(LLM)作为当前人工智能领域的核心技术,通过其强大的自然语言理解和生成能力,正在深刻改变人机交互方式。其工作原理基于Transformer架构,通过海量数据训练,学习语言的统计规律与语义关联。这项技术的核心价值在于,它能够作为通用基础,赋能于多样化的下游应用,实现个性化的智能对话与内容创作。在工程实践中,如何高效、灵活且低成本地部署和利用这些模型,成为开发者与爱好者的关键需求。本地化部署方案,特别是结合如Ollama、KoboldCPP等推理引擎,提供了数据隐私保障与可控的硬件成本。Silly

weixin_42520448的博客 431

LeetCode12题——integer to roman

问题描述 oman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 V 5 X 10 L 50 C 100 D ...

apollo_steve的博客 305

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

LeetCode 12. Integer to Roman

LeetCode 12.Integer to Roman

sophie__的博客 300

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【12】Integer to Roman

按9 5 4 1一点一点减 string intToRoman(int num) { string res=""; int c=num/1000; res+=string(c,'M'); num-=(c*1000); if(num>=900){res+="CM";num-=900;} else if(num>=500){res+="D";num-=

LSbiubiubiu的博客 438

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

12 Integer to Roman

1 题目 Roman numerals are represented by seven different symbols:I,V,X,L,C,DandM. Symbol Value I 1 V 5 X 10 L 50 C 100 D ...

weixin_39145266的博客 128

12. Integer to Roman 13. Roman to Integer

12. Integer to Roman 题目描述 Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 V 5 X 10 L 50 C ...

qq_39029148的博客 150
上一篇: 38. Count and Say
下一篇: 2. Add Two Numbers
cyndi2011
博客等级 码龄13年 38粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值