乘风破浪: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. 关于rails中 rake db:create 失败的问题

    提示信息: rake aborted!Could not find a JavaScript runtime. See https://github.com/sstephenson/execjsfor ...

  2. 基础语言知识C++

    强制转换: (Cplusplus基础与提高(何桂林)21页) static_cast:有隐式转换的 格式: static_cast<目标类型> (标识符) int a = 10; int ...

  3. C#、OC递归锁

    做ios也有1年了,C#的东西有些都忘记了,最近几天也打算重温一下,不能学了ios把C#给抛弃了,两者都要抓,一精多专.目前C#只是重温,重点是web这块.今天主要是想起了之前做过的面试题,虽然题比较 ...

  4. C#实现文件下载的几种方式

    上篇博客也说了下C#中通过XML导出Excel,这些文件操作都挺有用的,下面是文件的下载,之前做项目都是把它写的空间日志中,以后有时间了把它们都弄出来 先把有问题的代码贴出来吧 using Syste ...

  5. Linux进程管理之“四大名捕”

    一.四大名捕 四大名捕,最初出现于温瑞安创作的武侠小说,是朝廷中正义力量诸葛小花的四大徒弟,四人各怀绝技,分别是轻功暗器高手“无情”.内功卓越的高手“铁手”.腿功惊人的“追命”和剑法一流的“冷血”本文 ...

  6. jQuery 数据 - jQuery.data() 方法

    打印出 hi

  7. HDU 2544(简单最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=2544 /* 使用pair代替结构 */ #include <iostream> #include & ...

  8. swoole框架快速入门

    swoole有两个部分. 一个是PHP扩展,用C开发的,这是核心. 另一个是框架,像yii.TP.Laravel一样,是PHP代码写的. swoole扩展本身提供了web服务器功能,可以替代php-f ...

  9. k:特殊的线性表—栈

    栈(Stack):  栈是一种特殊的线性表,栈中的数据元素以及数据元素之间的逻辑关系和线性表相同,两者之间的差别在于:线性表的插入和删除操作可以在表的任意位置进行,而栈的插入和删除操作只允许在表的尾端 ...

  10. SQLServer数据库系统概念

    数据模型是一种抽象模型,现实世界中的客观事物是彼此相互联系的 (1)数据模型是一组集成的概念,用户描述和操作组织内的数据,数据间的联系以及对数据的约束,它包含了数据结构,数据操作和完整性约束 (2)概 ...