罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符          数值
I
V
X
L
C
D
M

例如, 罗马数字 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。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
输入: "III"
输出:
输入: "IV"
输出:
输入: "IX"
输出:
输入: "LVIII"
输出:
解释: L = , V= , III = .
输入: "MCMXCIV"
输出:
解释: M = , CM = , XC = , IV = .

按照题意,其实就是算出各个罗马数字,然后进行相加。但是这个罗马数字有可能是1个字符代表一个数字,也有可能两个字符代表一个数字,所以我就用了两个map来记录下这两种不同的情况

  specialRomanStringMap := map[string]int{"IV": , "IX": , "XL": , "XC": , "CD": , "CM": }//特殊罗马数字
romanStringMap := map[string]int{"I": , "V": , "X": , "L": , "C": , "D": , "M": }//正常罗马数字
  1. 然后我们就要对给定的字符串去取字符
  2. 但是当我们取到一个字符的时候,我们还得再取一个字符,用两个字符去特殊的map去查找是否存在
  3. 当存在的时候我们就记录下值
  4. 当没有的时候,我们就用第一个字符去正常的罗马数字map中找,并记录下值

整体代码:

func romanToInt(s string) int {
specialRomanStringMap := map[string]int{"IV": , "IX": , "XL": , "XC": , "CD": , "CM": } //特殊罗马数字
romanStringMap := map[string]int{"I": , "V": , "X": , "L": , "C": , "D": , "M": } //正常罗马数字
result :=
for len(s) != { //对字符串循环
if len(s) > { //当长度大于1的时候,才有必要去特殊罗马数字map中查找
chars := s[:] //首先我们得拿出两个字符去特殊的map中查找
if v, ok := specialRomanStringMap[chars]; ok { //当存在的时候记录值
result += v
s = s[:]
} else { //不存在的时候去正常map中查找,并记录
result += romanStringMap[string(s[])]
s = s[:]
}
} else { //当字符串的长度小于等于1的就只能去正常的罗马数字map中查找
result += romanStringMap[string(s[])]
s = s[:]
}
}
return result
}

还有另外种思路,请仔细看下面三个说明:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
举个例子
  • 当输入是IV,那就是4,当输入是VI,那就是6
  • 当输入是IX,那就是9,当输入是XI,那就是11
  • 当输入是XL,那就是40,当输入是LX,那就是60
  • 当输入是XC,那就是90,当输入是CX,那就是110
  • 当输入是CD,那就是400,当输入是DC,那就是600
  • 当输入是CM,那就是900,当输入是MC,那就是1100
可以看出来有一个规律:右加左减

按照这个规律,那就可以从字符串的右边开始处理

func romanToInt1(s string) int {
res :=
m := map[byte]int{
'I': ,
'V': ,
'X': ,
'L': ,
'C': ,
'D': ,
'M': ,
} last :=
for i := len(s) - ; i >= ; i-- {
temp := m[s[i]]//拿到最后一位 sign := //用于标记是减还是加
if temp < last {
//小数在大数的左边,要减去小数
sign = -
} res += sign * temp last = temp
} return res
}

罗马数字转整数的golang实现的更多相关文章

  1. C#版 - Leetcode 13. 罗马数字转整数 - 题解

    C#版 - Leetcode 13. 罗马数字转整数 - 题解 Leetcode 13. Roman to Integer 在线提交: https://leetcode.com/problems/ro ...

  2. Leetcode#13. Roman to Integer(罗马数字转整数)

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

  3. 【LeetCode】13. 罗马数字转整数

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

  4. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  5. LeetCode 13 Roman to Integer(罗马数字转为整数)

    题目链接 https://leetcode.com/problems/roman-to-integer/?tab=Description   int toNumber(char ch) { switc ...

  6. C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数

    各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 输出: 解释: 各位相加的过程为: + = , + = . 由于 是一位数,所以返回 . 进阶:你可以 ...

  7. Leecode刷题之旅-C语言/python-13.罗马数字转整数

    /* * @lc app=leetcode.cn id=13 lang=c * * [13] 罗马数字转整数 * * https://leetcode-cn.com/problems/roman-to ...

  8. LeetCode:罗马数字转整数【13】

    LeetCode:罗马数字转整数[13] 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 10 ...

  9. 13. Roman to Integer[E]罗马数字转整数

    题目 Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from ...

随机推荐

  1. SpringCloud断路器监控面板——Hystrix Dashboard

    一.简介 Hystrix Dashboard是Hystrix的一个组件,Hystrix Dashboard提供一个断路器的监控面板,可以使我们更好的监控服务和集群的状态,仅仅使用Hystrix Das ...

  2. Mysql、MongoDB对比和使用场景

    MongoDB: 更高的写入负载 默认情况下,MongoDB更侧重高数据写入性能,而非事务安全,MongoDB很适合业务系统中有大量“低价值”数据的场景.但是应当避免在高事务安全性的系统中使用Mong ...

  3. MySQL 5.6 GTID Replication

    一. MySQL 5.6引入了GTID的概念,那么GTID是何方神圣?其实也不复杂,就是一个全局事务标示符.使用GTID时,每次事务提交都会在binlog里生成1个唯一的标示符,它由UUID和事务ID ...

  4. CSS兼容性(IE和Firefox)技巧

    CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理技巧并整理了一下.对于web2.0的过度,请尽量用xhtml格 ...

  5. javascript变量提升详解

    js变量提升 对于大多数js开发者来说,变量提升可以说是一个非常常见的问题,但是可能很多人对其不是特别的了解.所以在此,我想来讲一讲. 先从一个简单的例子来入门: a = 2; var a; cons ...

  6. Rails/ActiveRecord order by Array

    ActiveRecord中如果想根据自定义的一个数组id集合排序: ids = [2,1,3] users = User.where("id in (?)",ids) result ...

  7. varnish实践

    一.实验环境: 1.软件版本: 系统版本:CentOS Linux release 7.4.1708 (Core) php版本:PHP 7.2 nginx版本:nginx-1.12.2 数据库版本:M ...

  8. 【表格设置】HTML中合并单元格,对列组合应用样式,适应各浏览器的内容换行

    1.常用表格标签 普通    <table>           |           <tr>          |           |          <th ...

  9. [PHP]算法- 判断是否为二叉搜索树的后序遍历序列的PHP实现

    二叉搜索树的后序遍历序列: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 1.后序遍历是 左右中 ...

  10. R0~R16寄存器作用

    R0-R3     用作传入函数参数,传出函数返回值.在子程序调用之间,可以将 r0-r3 用于任何用途. 被调用函数在返回之前不必恢复 r0-r3.如果调用函数需要再次使用 r0-r3 的内容,则它 ...