当前位置: 首页 > news >正文

Leetcode 12 - Integer to Roman

题目

https://leetcode.com/problems/integer-to-roman/

题意

给出一个整数,要求你将其转换成罗马数字。

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

Example 1:

Input: 3
Output: "III"

Example 2:

Input: 4
Output: "IV"

Example 3:

Input: 9
Output: "IX"

Example 4:

Input: 58
Output: "LVIII"
Explanation: L = 50, V = 5, III = 3.

Example 5:

Input: 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

思路

author's blog == http://www.cnblogs.com/toulanboy/

(1)这道题其实就是一个数字拼凑,可以直接用深搜来解决。

我们可以把该数字看成是最多有N个罗马数字组成,每个位置罗马数字的选择情况就构成了问题状态空间。该状态空间的层次便是第i个位置选择的罗马数字。我们只需遍历整个状态空间,就可以得到我们要的答案。

(2)而问题是:每个位置的数字的选择有哪些。

通过题目,可知有7个数字表示方式,而且题目也告知我们是可以两个组合使用的,如小的在大的前面,那么数值就是大的减去小的。从这些信息来看,我以为有28种表示方式。然而,题目很坑爹呀,他并没有告诉我们完整规则。实际上,通过查阅知乎[1]和5次的自信含泪提交,最终发现只有13种表示方式。具体表示方式请看下面代码实现。

(3)在深搜过程中可以优化搜索顺序。优先填写大的数字,这样更容易达到指定的和。其实从罗马数字的规则来看,罗马数字也应该用尽量短的字符串来表示的。所以这个剪枝既可以说是使用了技巧,也可以说迎合了题目规则。

(4)这道题假如不优先填写大的数字,那么虽然最终求出的罗马数字也符合数值,但是不是最短的。所以如果不采用(3)中的搜索顺序,那么可以采用迭代加深的思想。在迭代加深的过程中,实际上便是不停地延长答案长度的过程,这样可以确保搜索到的答案肯定是最短的。若读者感兴趣,可以自行实现该思路~

代码

//author's blog == http://www.cnblogs.com/toulanboy/
class Solution {
public:
    string roman[13] = {"M", "CM", 
                      "D","CD", 
                      "C", "XC", 
                      "L",  "XL", 
                      "X", "IX", 
                      "V", "IV",
                      "I"};

    int value[13] = {1000, 900,
                   500, 400,
                   100, 90, 
                   50, 40,
                   10, 9, 
                   5, 4,
                   1};


    int caseNum = 13;
    stack<string> result;


//author's blog == http://www.cnblogs.com/toulanboy/
    bool dfs(int sum, int target){
        if(sum == target){

            return true;
        }
        for(int i=0; i<caseNum; ++i){
            if(sum + value[i] <= target){
                result.push(roman[i]);
                if(dfs(sum+value[i], target))
                    return true;
                result.pop();
            }
        }
        return false;
    }
    
    string intToRoman(int num) {
        dfs(0, num);
        stack<string> temp;
        while(result.empty() == false){
            temp.push(result.top());
            result.pop();
        }
        string romanResult = "";
        while(temp.empty() == false){
            romanResult += temp.top();
            temp.pop();
        }
        return romanResult;
    }
};

运行结果

Runtime: 12 ms
Memory Usage: 15.2 MB

参考文章

【1】 罗马数字的构造规则

转载于:https://www.cnblogs.com/toulanboy/p/10898337.html

相关文章:

  • yum常用命令
  • AJPFX分享JAVA修饰符详解
  • 华华教奕奕写几何
  • 《零基础入门学习Python》【第一版】视频课后答案第001讲
  • Zabbix“专家坐诊”第10期问答汇总
  • LinkedList源码阅读分析
  • Spring全家桶视频教程
  • 【重点】米尔发布Zynq UltraScale MPSoC核心板
  • iOS QQ 登录
  • java版spring cloud+spring boot+redis多租户社交电子商务平台 (六)分布式配置中心(Spring Cloud Config)...
  • 线程安全性
  • wps怎么转图片?
  • iOS开发的底线-崩溃
  • LEANGOO卡片
  • margin-top 外边距合并
  • Angular 响应式表单 基础例子
  • Babel配置的不完全指南
  • css属性的继承、初识值、计算值、当前值、应用值
  • EventListener原理
  • HTTP中GET与POST的区别 99%的错误认识
  • java8-模拟hadoop
  • Python学习之路16-使用API
  • React 快速上手 - 07 前端路由 react-router
  • SQLServer之创建数据库快照
  • Terraform入门 - 3. 变更基础设施
  • Twitter赢在开放,三年创造奇迹
  • 阿里研究院入选中国企业智库系统影响力榜
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 汉诺塔算法
  • 深度学习在携程攻略社区的应用
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用Gradle第一次构建Java程序
  • 思维导图—你不知道的JavaScript中卷
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一些关于Rust在2019年的思考
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (12)目标检测_SSD基于pytorch搭建代码
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (七)c52学习之旅-中断
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)Neo4j下载安装以及初次使用
  • (转)一些感悟
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • @Validated和@Valid校验参数区别