这是悦乐书的第145次更新,第147篇原创

今天这道题和罗马数字有关,罗马数字也是可以表示整数的,如“I”表示数字1,“IV”表示数字4,下面这道题目就和罗马数字有关,你能猜到吗?

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第4题(顺位题号是17),给定一组罗马数字组成的字符串,将其转换为整数。

罗马数字包含下面7个字符:

符号 值

I 1

V 5

X 10

L 50

C 100

D 500

M 1000

下面是些小例子,帮助我们更好理解组合规则。

输入: “III”

输出: 3

输入: “IV”

输出: 4

输入: “LVIII”

输出: 58

说明: L = 50,V = 5,III = 3。

输入: “MCMXCIV”

输出: 1994

说明: M = 1000,CM = 900,XC = 90,IV = 4。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 分析题目

罗马数字通常从左到右从最大到最小排列,大数字在前做加法,小数字在前做减法。

V在I的前面就是V+I=5+1=6,X在I的前面就是X+I=10+1=11

L在X的前面就是L+X=50+10=60,C在X的前面就是C+X=100+10=110

D在C的前面就是D+C=500+100=600,M在C的前面就是M+C=1000+100=1100

I在V的前面就是V-I=5-1=4,I在X的前面就是X-I=10-1=9

X在L的前面就是L-X=50-10=40,X在C的前面就是C-X=100-10=90

C在D的前面就是D-C=500-100=400,C在M的前面就是M-C=1000-100=900

理解这些后,我们第一步是要将基础字符和所代表的数字存起来,这种类似键值对的组合,很容易让人联想到HashMap。

第二步就需要获取传入的字符串每个字符所代表的数字是什么,同时还要判断相邻两位字符所表示数字的大小关系,因为这决定着求总数的时候是做加法还是做减法。

第三步需要加上最后一位字符所表示的数字,因为相邻两位做比较,最后一次比较的是倒数第二位和倒数第一位,求和(差)只是算到了倒数第二位,所以在循环结束后,需要加上最后一位的值。因为最后一位字符后面再无其他字符,所以只能做加法。

public static int romanToInt(String s) {
int result = 0;
Map<Character, Integer> map = new HashMap<Character, Integer>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
if (s.length() == 0) {
return 0;
}
char[] arr = s.toCharArray();
int i=0, j=1;
for (; i<arr.length-1; i++,j++) {
if (map.get(arr[i]) >= map.get(arr[j])) {
result += map.get(arr[i]);
} else {
result -= map.get(arr[i]);
}
}
result += map.get(arr[i]);
return result;
}

03 小结

今天这道题还是比较简单的,弄清楚罗马数字的规则后,只需要将其演绎成相应代码即可。

如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

本文首发于我的个人公众号:悦乐书,转载请注明出处!

【算法】LeetCode算法题-Roman To Integer的更多相关文章

  1. 乘风破浪:LeetCode真题_013_Roman to Integer

    乘风破浪:LeetCode真题_013_Roman to Integer 一.前言 上一节我们讨论了如何把阿拉伯数字转换成罗马数字,现在我们需要思考一下如何把罗马数字转换成阿拉伯数字,其实我们仔细观擦 ...

  2. 乘风破浪:LeetCode真题_008_String to Integer (atoi)

    乘风破浪:LeetCode真题_008_String to Integer (atoi) 一.前言 将整型转换成字符串,或者将字符串转换成整型,是经常出现的,也是必要的,因此我们需要熟练的掌握,当然也 ...

  3. 《LeetBook》leetcode题解(13):Roman to Integer[E]

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  4. 【LeetCode】13. Roman to Integer (2 solutions)

    Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within t ...

  5. C# 写 LeetCode easy #13 Roman to Integer

    13.Roman to Integer Roman numerals are represented by seven different symbols: I, V, X, L, C, D and  ...

  6. leetcode第13题--Roman to Integer

    Problem: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range ...

  7. 【leetcode刷题笔记】Integer to Roman

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

  8. (算法)LeetCode刷题

    LeetCode 56 合并区别 Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18]. 关键就是a[1]>=b[0] 也就 ...

  9. 【一天一道LeetCode】#13. Roman to Integer

    一天一道LeetCode系列 (一)题目 Given a roman numeral, convert it to an integer. Input is guaranteed to be with ...

随机推荐

  1. Perl匿名数组、hash和autovivification特性

    可有构建匿名的对象,这样就没必要去为只用一两次的数组.hash去取名字,有时候取名是很烦的事. 使用中括号[]构建匿名数组 使用大括号{}构建匿名hash 不包含任何元素的[]和{}分别是匿名空数组. ...

  2. 分布式系统监视zabbix讲解五之web监控--技术流ken

    Web 监控 概况 你可以使用 Zabbix 检查几个网站可用性方面. 如果要使用 Web 检测功能,必须在 编译Zabbix 的时候加入 cURL(libcurl) 的支持. 要使用 Web 监控, ...

  3. 《Thinking In Java》---第四版 练习题答案

    百度网盘下载:https://pan.baidu.com/share/link?shareid=2111776725&uk=2869544179&app=zd 在线查看:http:// ...

  4. [转]简单科普私钥、地址、助记词、Keystore的区别

    本文转自:https://www.jianshu.com/p/d0a4a44685d3 很多人保管不好自己的虚拟财产,发生丢币的情况,很多都是因为不清楚私钥的概念. 私钥(Private Key) 比 ...

  5. WPF TreeView SelectedItemChanged called twice

    How to avoid WPF TreeView SelectedItemChanged being called twice Very often, we need to execute some ...

  6. Bootstrap中的datetimepicker用法

    本文实例为大家分享了bootstrap datetimepicker日期插件的简单使用,供大家参考,具体内容如下 首先在文件头部引入必要的文件: 1 2 <link rel="styl ...

  7. eclipse使用svn

    主干(trunk).分支(branch ).标记(tag) 用法示例 + 图解   以svn为例,git的master相当于trunk,dev分支相当于branches --------------- ...

  8. 在Java中进行序列化和反序列化

    对象序列化的目标是将对象保存在磁盘中,或者允许在网络中直接传输对象. 对象序列化允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上或者通过网络将这种二进制流传输 ...

  9. 详解margin: auto

    auto是margin的可选值之一.相信大家平时使用auto值时,最多的用法大概是 margin: 0 auto; 和 margin: auto; 不过你可能也发现了不论是 margin: auto; ...

  10. MySQL5.7: Paging using Mysql Stored Proc

    -- 查询外键 涂聚文 (Geovin Du) select concat(table_name, '.', column_name) as 'foreign key', concat(referen ...