Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

首先是罗马字符串的特点:

羅馬數字共有7個,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。按照下述的規則可以表示任意正整數。需要注意的是罗马数字中没有“0”,與進位制無關。一般認為羅馬數字只用來記數,而不作演算。
重複數次:一個羅馬數字重複幾次,就表示這個數的幾倍。
右加左減:
  在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字。
  在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字减小數字。
  左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
  但是,左減時不可跨越一個位數。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同於阿拉伯數字每位數字分別表示。)
  左減數字必須為一位,比如8寫成VIII,而非IIX。
  右加數字不可連續超過三位,比如14寫成XIV,而非XIIII。(見下方“數碼限制”一項。)
加線乘千:
  在羅馬數字的上方加上一條橫線或者加上下標的Ⅿ,表示將這個數乘以1000,即是原數的1000倍。
  同理,如果上方有兩條橫線,即是原數的1000000(1000^{2})倍。
數碼限制:
  同一數碼最多只能出現三次,如40不可表示為XXXX,而要表示為XL。
  例外:由於IV是古羅馬神話主神朱庇特(即IVPITER,古羅馬字母裡沒有J和U)的首字,因此有時用IIII代替Ⅳ。

上面的解释是从别处抄的,思路主要是把每一位与前一位进行比较,大于前一位即用当前位减去上一位保存在临时和中,小于就将临时和加到总和中,等于就给临时和加上当前位数值。大妈如下:

 class Solution {
public:
int romanToInt(string s) {
int prev, curr, result, tmpResult;
prev = curr = result = tmpResult = ;
int sz = s.size();
if(sz == )
return ;
tmpResult = prev = getRoman(s[]);
for(int i = ; i < sz; ++i){
curr = getRoman(s[i]);
if(curr > prev)
tmpResult = curr - prev;
else if(curr == prev)
tmpResult += curr;
else{
result += tmpResult;
tmpResult = curr;
}
prev = curr;
}
return result + tmpResult;
} int getRoman(char c)
{
switch(c){
case 'I':
return ;
case 'V':
return ;
case 'X':
return ;
case 'L':
return ;
case 'C':
return ;
case 'D':
return ;
case 'M':
return ;//题目说了,最多只能到4999,不用取更大的了
default:
return ;
}
}
};

java版本的代码如下,只是为了熟悉一下java的使用:

 public class Solution {
public int romanToInt(String s) {
int prev, curr, tmpRes, ret;
prev = curr = tmpRes = ret = 0;
int sz = s.length();
if(sz == 0)
return 0;
tmpRes = prev = RToI(s.charAt(0));
for(int i = 1; i < sz; ++i){
curr = RToI(s.charAt(i));
if(curr < prev){
ret += tmpRes;
tmpRes = curr;
}else if(curr > prev){
tmpRes = curr - prev;
}else{
tmpRes += curr;
}
prev = curr;
}
return ret + tmpRes;
} public int RToI(char c){
switch(c){
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;//给出数字小于5000,无需在大
default:
return 0;
}
}
}

LeetCode OJ:Roman to Integer(转换罗马字符到整数)的更多相关文章

  1. [LeetCode OJ] Roman to Integer

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

  2. leetcode-13罗马字符转整数

    leetcode-13罗马字符转整数 算法:转换的规律是先逐字符按照对应的阿拉伯数字累加,然后对于特殊的(I.X.C出现在左侧)要处理.处理方法:出现特殊字符组合减去双倍的左侧字符(在开始的处理中已经 ...

  3. [LeetCode][Python]Roman to Integer

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/roman-t ...

  4. 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 ,即 ...

  5. 【JAVA、C++】LeetCode 013 Roman to Integer

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

  6. leetcode:Roman to Integer and Integer to Roman

    2015-06-03 罗马数字以前接触过I到VIII比较多,直到遇见这个题目才知道更详细.阿拉伯数字和罗马数字之间的转换最重的是了解罗马数字的规则. 罗马数字规则:(总结) 1, 罗马数字共有7个,即 ...

  7. 【LeetCode】Roman to Integer & Integer to Roman

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

  8. Leetcode 13 Roman to Integer 字符串处理+STL

    题意:将罗马数字1到3999转化成自然数字,这里用了STL库map将罗马字符映射到自然数字. I,V,X,L,C,D,M -> 1,5,10,50,100,500,1000 m[s[i]]< ...

  9. Leetcode 13. Roman to Integer(水)

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

随机推荐

  1. 采购订单打印并预览PDF

    *&---------------------------------------------------------------------* *& Report Z01MMF019 ...

  2. UML类图几种关系的总结(转载 http://blog.csdn.net/tianhai110/article/details/6339565 )

    http://blog.csdn.net/tianhai110/article/details/6339565

  3. PHP 多字节字符串 函数

    参考资料 多字节字符编码方案和他们相关的问题相当复杂,超越了本文档的范围. 关于这些话题的更多信息请参考以下 URL 和其他资源. Unicode materials » http://www.uni ...

  4. 理解盒模型——外边距、内边距和边框之间的关系,IE 8以下版本的浏览器中的盒模型有什么不同。

    一个元素盒模型的层次从内到外分别为:内边距.边框和外边距IE8以下浏览器的盒模型中定义的元素的宽高不包括内边距和边框

  5. linux 安装 maven

    一.下载 1.创建下载软件包目录  mkdir /home/install 2.在/home/install下载maven包,或者将下载好的maven压缩包上传至/home/install wget  ...

  6. 谁说程序员不懂爱情【Her】

    2014.8.17日 我和我女朋友恋爱两周年的日子.走到今天很不容易,我很珍惜. 就想趁这机会,尽自己能力做一个特别的礼物. 这款应用两周前就开始计划了.也熬了几个晚上.接触wp开发时间不长,第一款应 ...

  7. Entity FrameWork Code First 之 MVC4 数据库初始化策略用法

    通过启用迁移和更新数据库可以很容易的生成一张表.但是对数据库修改之后,通过数据迁移就没那么好实现了. 这里用到数据库生成策略,进行对数据库操作: 一.3种主要数据库生成策略 1 CreateDatab ...

  8. 官方online ddl

    一.5.6版本online DDL 操作 In Place Rebuilds Table Concurrent DML Only Modifies Metadata 说明 add/create sec ...

  9. Chemistry

    Problem A. Chemistry Input file: chemistry.in Output file: chemistry.out Time limit: 1 seconds Memor ...

  10. session的活化与钝化 (转)

    session的活化与钝化就是当用户访问时网站异常,不能丢掉session,所有也必须采用文件存储:和之前那个统计网站访问量一样的原理. class Person implements必须实现这两个接 ...