乘风破浪: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. PHP之string之str_repeat()函数使用

    str_repeat (PHP 4, PHP 5, PHP 7) str_repeat - Repeat a string str_repeat - 重复一个字符串 Description strin ...

  2. 以安全模式启动firefox

    碰到firefox打开后一直没有响应,解决方法: 以安全模式打开

  3. IOS项目之弹出动画三

    前面写了弹出动画两个,今天做商城时又用到了,看着这个用着蛮普遍的,所以记了下来 // // mallMoreView.h // XQB // // Created by City--Online on ...

  4. Vue学习笔记:Slot

    转自:https://www.w3cplus.com/vue/vue-slot.html 在Vue中,slot也分多种,从Vue的官网中可以获知,其主要分为:单个插槽.具名插槽和作用域插槽三种 父组件 ...

  5. 使用重绘项美化WinForm中的控件

    如果你觉得项目中的ComboBox.ListBox或其它的Winforms控件不能满足你的显示要求,包括窗体在内很多控件都支持重绘修改显示样式.下面的示例完成对ComBox数据项的重绘,希望能起到抛砖 ...

  6. Java学习--使用 Math 类操作数据

    使用 Math 类操作数据 Math 类位于 java.lang 包中,包含用于执行基本数学运算的方法, Math 类的所有方法都是静态方法,所以使用该类中的方法时,可以直接使用类名.方法名,如: M ...

  7. dbUtils 中的各种 Handler 什么 意思

    ArrayHandler:把结果集中的第一行数据转成对象数组. ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中. BeanHandler:将结果集中的第 ...

  8. 修改Nginx 伪静态Rewrite规则 安装Chevereto

    Chevereto 是目前最为强大的 PHP 图床系统,通过它可部署多用户公开或私有的图片存储服务,现在 Chevereto 出了免费的版本,小伙伴可以围观一下. https://github.com ...

  9. drupal中安装CKEditor文本编辑器,并配置图片上传功能 之 方法二

    drupal中安装CKEditor文本编辑器,并配置图片上传功能 之 方法一 中介绍了ckeditor的安装和配置方法,其实还有另一种新方法,不用IMCE模块. 不过需要ckfinder的JS库,可以 ...

  10. svn add @2x image 文件

    svn add `svn status . | grep "^?" | awk '{print $2"@"}'`