罗马数字包含以下七种字符: 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. 【杂谈】Starter Template

    Spring Boot 项目与普通项目在包管理上的差别主要差别就是,Spring Boot在包管理上用了starter template,你应该经常看到xxx-starter这类的dependency ...

  2. Django组件之cookie与session

    一.引子 http协议是无状态的,就是它不会记录请求和响应的任何信息,比如你访问一个服务器的一个网页时,先要你登录一下,然后进入网页,但当你要进入这个服务器的另一个网页时,它照常不会知道刚才你已经登录 ...

  3. C# 性能优化 之 秒表 Stopwatch。

    生词解释:Diagnostics[,daɪəg'nɑstɪks] n.诊断学 using System.Diagnostics; Stopwatch sw = new Stopwatch (); sw ...

  4. VS2015企业版专业版密钥

    亲测可用,有需要的可以mark一下! 专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

  5. SqlHelper 1.0

    SqlHelper类,可以简化对数据库的操作. 将程序中需要经常用到的数据库操作,如:连接字符串.对数据的增.删.改.查封装成“SqlHelper”类中的静态属性,方便在程序各部分进行调用. 增(in ...

  6. CentOS6.5安装mysql以及常见问题的解决

    前言 最近在学习Linux系统,今天在安装MySQL数据库时出现很多问题,花费了两个小时终于解决,故记录下来以供大家参考.(本人目前还在学习阶段,下面写到的是自己结合网上查到的资料以及各位前辈给出的解 ...

  7. java反射与动态代理的理解

    一.什么是反射机制? 反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象 ...

  8. canvas-6font.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. js识别设备

    console.log(window.navigator); Navigator 对象属性         appCodeName     返回浏览器的代码名.         appMinorVer ...

  10. python之管道, 事件, 信号量, 进程池

    管道:双向通信 2个进程之间相互通信 from multiprocessing import Process, Pipe def f1(conn): from_zjc_msg = conn.recv( ...