罗马数字转整数

  • 题目描述

罗马数字包含以下七种字符I V X LCD  M

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

例如, 罗马数字 2 写做 II ,即为两个并列的 112 写做 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。

(1)给定一个罗马数字,将其转换成整数。输入确保在 3999 的范围内。

示例 1:

输入: "III"
输出: 3

示例 2:

输入: "IV"
输出: 4

示例 3:

输入: "IX"
输出: 9

示例 4:

输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

示例 5:

输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
  • 问题分析

根据示例5进行分析:

MCMXCIV 

读到第一个字符为M,后一个为C M>C所以直接相加,初始化sum=0,sum=sum+s[0]=1000

当字符读到第二个字符C,后一个为M  C<M,后面的字符大,sum=sum-s[1]=1000-100=900

当字符读到第三个字符M,后一个为X  X<M,后面的字符小,sum=sum+s[2]=900+1000=1900

当字符读到第四个字符X,后一个为C  C>X,后面的字符大,sum=sum-s[3]=1900-10=1890

当字符读到第五个字符C,后一个为I  C>I,后面的字符小,sum=sum+s[4]= 1890+100=1990

当字符读到第六个字符I,后一个为V  V>I,后面的字符大,sum=sum-s[5]= 1990-1=1989

当字符读到第七个字符V,后一个为null  为空直接相加,sum=sum+s[6]= 1989+5=1994

  • 解题思路

理解罗马数字的组合时可以看成左右两部分,从左往右扫一遍s,创建hash表存储key和value

如果遇到右边比左边大的,则左边的这一部分便是负的,否则直接加到底就好

  • 具体代码如下:
class Solution {
public:int romanToInt(string s) {//创建hash表map<char,int>m={{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};int tmp,sum=0;for(int i=0;s[i]!='\0';i++){tmp=m[s[i]];if(s[i+1]&&m[s[i+1]]>m[s[i]]){sum=sum-tmp;}elsesum=sum+tmp;}return sum;}
};

(2)给定一个整数,将其转换成罗马数字。输入确保在 3999 的范围内。

示例 1:

输入: 3
输出: "III"
示例 2:

输入: 4
输出: "IV"
示例 3:

输入: 9
输出: "IX"
示例 4:

输入: 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
示例 5:

输入: 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

  • 解题思路:

(1)暴力匹配,硬解码    从高位到低位  逐位处理

比如:

使用模运算和除法运算,可以得到我们数字中每个位上的数字。
thousands_digit = integer / 1000
hundreds_digit = (integer % 1000) / 100
tens_digit = (integer % 100) / 10
ones_digit = integer % 10
然后,我们可以简单地在硬编码表(可通过容器或数组创建)中查找这些结果,并将结果附加在一起

  • 具体代码如下:
class Solution {
public:string intToRoman(int num) {vector<string> thousand = { "", "M", "MM", "MMM" };vector<string> hundred = { "", "C", "CC", "CCC", "CD", "D","DC","DCC","DCCC","CM" };vector<string> decad = { "", "X", "XX", "XXX", "XL", "L","LX","LXX","LXXX","XC" };vector<string> unit = { "", "I", "II", "III", "IV", "V","VI","VII","VIII","IX" };string out = thousand[num / 1000];out += hundred[(num % 1000) / 100];out += decad[(num % 1000 % 100) / 10];out += unit[num % 1000 % 100 % 10];return out;}
};

(2)贪心算法:

例如,假设我们需要将数字设为478。

478 中最大的符号是 CD(值 400)。

Roman Numeral so far: CD
Integer remainder: 478 - 400 = 78
我们在 78 的基础重复以上步骤,最大的符号是 L(值 50)。

Roman Numeral so far: CDL
Integer remainder: 78 - 50 = 28
在 28 的基础重复以上步骤,最大的符号是 X (值 10)。

Roman Numeral so far: CDLX
Integer remainder: 28 -10 = 18
在 18 的基础重复以上步骤,最大的符号是 X (值 10)。

Roman Numeral so far: CDLXX
Integer remainder: 18 - 10 = 8
在 8 的基础重复以上步骤,最大的符号是 V (值 5)。

Roman Numeral so far: CDLXXV
Integer remainder: 8 - 5 = 3

在 3 的基础重复以上步骤,最大的符号是 I (值 1)
最后,用 I 表示 1,完成转换。

Roman Numeral so far: CDLXXVIII
Integer remainder: 1 - 1 = 0

  • 具体代码如下:
class Solution {
public:string intToRoman(int num) {string res;vector<int> values={1000,900,500,400,100,90,50,40,10,9,5,4,1};vector<string> symbol={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};for(int i=0;i<values.size()&&num>0;i++){while(num>=values[i]){res.append(symbol[i]);num-=values[i];}}return res;}
};

参考来源:Leetcode算法题

罗马数字与整数相互转换相关推荐

  1. java输出罗马数字_Java实现的求解经典罗马数字和阿拉伯数字相互转换问题示例...

    本文实例讲述了Java实现的求解经典罗马数字和阿拉伯数字相互转换问题.分享给大家供大家参考,具体如下: 古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来 ...

  2. 【每日一算法】罗马数字转整数

    微信改版,加星标不迷路! 每日一算法-罗马数字转整数 作者:阿广 阅读目录 1 题目 2 解析 1 题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1 V 5 ...

  3. LeetCode(13.罗马数字转整数) JAVA Hashmap

    LeetCode(13.罗马数字转整数) JAVA Hashmap 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D ...

  4. leetcode 两数之和 整数反转 回文数 罗马数字转整数

    1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...

  5. LeetCode 13罗马数字转整数14最长公共前缀

    罗马数字转整数 上一题是整数转罗马数字,这题是罗马数字转整数.虽然是简单题,但我感觉其实有点烦. 上一次是数字转字符,这次是字符转数字,总的来说大体思想还是差不多的. 首先整个字符串可能是这样构造的: ...

  6. 罗马数字 java_【leetcode刷题】[简单]13.罗马数字转整数(roman to integer)-java

    罗马数字转整数 roman to integer 题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M ...

  7. LeetCode题 - 13 罗马数字转整数

    罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 I ...

  8. 20190913:(leetcode习题)罗马数字转整数

    罗马数字转整数 题目 大致思路 代码实现 题目 大致思路 跟上题一样,不需要思路,直接把各种情况列出来即可. 代码实现 package com.immunize.leetcode.romanTOINT ...

  9. 力扣——罗马数字转整数

    罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 I ...

最新文章

  1. ios 自动打包命令_【实践】iOS使用Jenkins实现自动化打包并上传蒲公英
  2. Java并发教程– CountDownLatch
  3. 混合云异军突起 英特尔的全“芯”体验为企业保驾护航
  4. uniapp苹果底部栏自适应配置
  5. android 绘制按钮,Android:使用xml定义创建一个三角形的按钮(可绘制)
  6. php用栈遍历目录和文件,php如何遍历目录,php非递归算法遍历目录的例子
  7. C#图片处理之:在图片上画直线
  8. mybatis中的#{}与${}在原理上的区别
  9. csgo准星设置代码_csgo准星代码怎么输入
  10. UBuntu安装CGI环境
  11. RAP简介教程常用规则
  12. 【LaTeX中英排版系列】LaTeX中英双标题、作者、机构、摘要文档首页排版指北
  13. python代码做图_如何用Python代码制作图
  14. springboot 和 js (vue) 实现SM3加密 防篡改
  15. 2009年国际电力行业十大新闻
  16. 30岁+,大龄青年转行程序员的切身经历
  17. 白银之手服务器人物不显示,白银之手 - 萌娘百科 万物皆可萌的百科全书
  18. BAPI_GOODSMVT_CREATE MIGO预留成本中心201发货实例
  19. 【渝粤教育】广东开放大学 工程力学 形成性考核 (27)
  20. 京东计划投资苏州高铁新城用地,11号公告内的3宗地块将正式出让

热门文章

  1. Android常见内存泄漏以及解决办法
  2. c语言如何计算中位数,如何计算中位数?
  3. Cluster analysis :Basic Concepts and Algorithms -- Part 3 Hierarchical Clustering
  4. chrome/Edge搜索技巧
  5. ActiveMQ--基础
  6. 用Python实现连续图文识别
  7. java socket / IM / Message / chat / liaotian / xmpp
  8. 练手小项目——别踩白块小游戏
  9. Vue获取浏览器唯一标识
  10. C# 中使用TCP连接设置超时问题