乘风破浪:LeetCode真题_013_Roman to Integer

一、前言

上一节我们讨论了如何把阿拉伯数字转换成罗马数字,现在我们需要思考一下如何把罗马数字转换成阿拉伯数字,其实我们仔细观擦这些结构就会发现罗马数字如果前面的比后面的小,就需要用后面的减去前面的。而且如果有这样的运算,也只是两个字符拼接而成的,这为我们解题提供了思路。

二、Roman to Integer

2.1 问题

2.2 分析与解决

根据题意,我们可以明白只需要从开始到结尾遍历这些罗马数字,如果发现前一个小于后一个代表的数字,则用后面的数值减去前面的数值,然后将这些数值相加在一起,这样就能得到最终的结果了。同样的我们也可以从后往前遍历,如果发现前面的小于后面的就进行减法操作,否则直接相加也是可以的。当然这一切都要依靠于给定的罗马数字是正确的前提下。

于是有了两种方式:从前往后,从后往前。

从前往后:

class Solution {
public int romanToInt(String s) {
if(s== null) return 0;
Map<Character, Integer> map= new HashMap<>();
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);
int sum = 0;
for(int i=0;i<s.length();i++) {
if((i+1 < s.length()) && map.get(s.charAt(i+1)) > map.get(s.charAt(i))) {
sum = sum + (map.get(s.charAt(i+1)) - map.get(s.charAt(i)));
i++;
}else{
sum = sum + map.get(s.charAt(i));
}
}
return sum; }
}

  从后往前:

public class Solution {
/**
* 题目大意
* 给定一个罗马数字,将其转换成对应的整数。
* 输入的数字在1-3999之间。
*
* 解题思路
* 根据罗马数字与整数数字对应关系进行加法操作,从后向前遍历,如果前一个数字比后一个大就相减,否则进行相加。
*/
public int romanToInt(String s) { int result = 0;
int prev = 0; // 记录前一个数字的值 for (int i = s.length() - 1; i >= 0; i--) {
switch (s.charAt(i)) {
case 'I': // 1
if (1 < prev) {
result -= 1;
} else {
result += 1; }
prev = 1;
break; case 'V': // 5 if (5 < prev) {
result -= 5;
} else {
result += 5;
} prev = 5; break;
case 'X': // 10
if (10 < prev) {
result -= 10;
} else {
result += 10;
} prev = 10;
break;
case 'L': // 50
if (50 < prev) {
result -= 50;
} else {
result += 50;
} prev = 50;
break;
case 'C': // 100
if (100 < prev) {
result -= 100;
} else {
result += 100;
} prev = 100;
break;
case 'D': // 500
if (500 < prev) {
result -= 500;
} else {
result += 500;
} prev = 500;
break;
case 'M': // 1000
result += 1000;
prev = 1000;
break;
}
} return result;
}
}

三、总结

同样的思路,有的代码写得非常具有条理性,有的写得比较复杂,运行之后的耗时也是不同的,因此需要软件工程技术上的培养。

乘风破浪:LeetCode真题_013_Roman to Integer的更多相关文章

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

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

  2. 乘风破浪:LeetCode真题_007_Reverse Integer

    乘风破浪:LeetCode真题_007_Reverse Integer 一.前言 这是一个比较简单的问题了,将整数翻转,主要考察了取整和取余,以及灵活地使用long型变量防止越界的问题. 二.Reve ...

  3. 乘风破浪:LeetCode真题_040_Combination Sum II

    乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...

  4. 乘风破浪:LeetCode真题_039_Combination Sum

    乘风破浪:LeetCode真题_039_Combination Sum 一.前言     这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...

  5. 乘风破浪:LeetCode真题_032_Longest Valid Parentheses

    乘风破浪:LeetCode真题_032_Longest Valid Parentheses 一.前言 这也是非常有意思的一个题目,我们之前已经遇到过两个这种括号的题目了,基本上都要用到堆栈来解决,这次 ...

  6. 乘风破浪:LeetCode真题_030_Substring with Concatenation of All Words

    乘风破浪:LeetCode真题_030_Substring with Concatenation of All Words 一.前言    这次我们还是找字符串的索引,不过,需要将另一个字符串列表中的 ...

  7. 乘风破浪:LeetCode真题_029_Divide Two Integers

    乘风破浪:LeetCode真题_029_Divide Two Integers 一.前言     两个整数相除,不能使用乘法除法和取余运算.那么就只能想想移位运算和加减法运算了. 二.Divide T ...

  8. 乘风破浪:LeetCode真题_018_4Sum

    乘风破浪:LeetCode真题_018_4Sum 一.前言 前面我们已经练习过了三个数相加的集合运算,现在变成了四个数,其实道理是一样的.三个数的时候可以转成两个数的加法,最后来解决,而四个数的可以转 ...

  9. 乘风破浪:LeetCode真题_015_3Sum

    乘风破浪:LeetCode真题_015_3Sum 一.前言 关于集合的操作,也是编程最容易考试的问题,比如求集和中的3个元素使得它们的和为0,并且要求不重复出现,这样的问题该怎么样解决呢? 二.3Su ...

随机推荐

  1. 【LESS系列】三角形Mixins

    又是一篇自 W3CPLUS 中转化而来的文章. 和 W3CPLUS 上的做法,在设计上最大的不同就在于,这里我用的是多个 Mixins 函数来实现. 先总结这种做法的特点: 需要额外的标签来实现,因此 ...

  2. Java对zip格式压缩和解压缩

    Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...

  3. 6.046 Design and Analysis of Algorithms

    课程信息 6.046 Design and Analysis of Algorithms

  4. php 截取中文字符串方法

    /** * 截取中文字符串函数 * @param $str 需要截取的字串 * @param $start 开始截取的位置 * @param $length 截取的长度 * @return 此函数返回 ...

  5. wpf 窗口最小化后,触发某事件弹出最小化窗口并置顶

    //如果窗口最小化了弹出并置顶----事件触发调用 ShowWindowAsync(new System.Windows.Interop.WindowInteropHelper(CommonHelpe ...

  6. 四、curator recipes之共享重入互斥锁

    简介 curator的recipes实现了可重入互斥锁,允许你在分布式场景下多个进程之间实现锁的互斥以协调多进程执行. 相关类:InterProcessMutex 官方文档:http://curato ...

  7. 八、阻塞等待异步结果FutureTask

    一.简介 默认的异步任务有些难以控制,有时候我们希望在当前线程获取异步任务的结果.FutureTask可以帮助我们实现 JDK文档:http://tool.oschina.net/uploads/ap ...

  8. springboot基本注解

    声明Bean的注解: @Component组件 @Service service层 @Respository dao层 @Controller 注入Bean的注解: @Autowired Spring ...

  9. 【SSH网上商城项目实战04】EasyUI菜单的实现

    转自:https://blog.csdn.net/eson_15/article/details/51297705 上一节我们使用EasyUI搭建了后台页面的框架,这一节我们主要使用EasyUI技术简 ...

  10. csharp:search and Compare string

    /// <summary> /// 涂聚文 /// 2011 捷为工作室 /// 缔友计算机信息技术有限公司 /// </summary> /// <param name ...