LeetCode OJ:Roman to Integer(转换罗马字符到整数)
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(转换罗马字符到整数)的更多相关文章
- [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 ...
- leetcode-13罗马字符转整数
leetcode-13罗马字符转整数 算法:转换的规律是先逐字符按照对应的阿拉伯数字累加,然后对于特殊的(I.X.C出现在左侧)要处理.处理方法:出现特殊字符组合减去双倍的左侧字符(在开始的处理中已经 ...
- [LeetCode][Python]Roman to Integer
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/roman-t ...
- 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 ,即 ...
- 【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 ...
- leetcode:Roman to Integer and Integer to Roman
2015-06-03 罗马数字以前接触过I到VIII比较多,直到遇见这个题目才知道更详细.阿拉伯数字和罗马数字之间的转换最重的是了解罗马数字的规则. 罗马数字规则:(总结) 1, 罗马数字共有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 ...
- 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]]< ...
- Leetcode 13. Roman to Integer(水)
13. Roman to Integer Easy Roman numerals are represented by seven different symbols: I, V, X, L, C, ...
随机推荐
- C#笔试面试宝典值得收藏
又是一年换工作纠结的季节,前一阵子由于工作的缘故,薪资降低,加之被其他部门以莫须有的罪名投诉:固然愤慨之,遂升起离职念想,下面是这几天电话面试和笔试中常问到的问题汇总,给大家分享下,不足之处往大神拍砖 ...
- nginx规则总结
location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的 ...
- 初识JS 基本语法.基本运算符
JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.( ...
- js 数组判断是否包含某元素 或 数组去重
判断包含: 1.借助 jquery $.inArray(obj.UNIVERSITY_NAME, arryDatas) < 0var arr = [ "xml", &quo ...
- 给IT男推荐一款车
标题是为了吸引人,其实这里要推荐的不是汽车而是自行车,确切的说是电动自行车(也有叫锂电自行车),见下图! (备注:淘宝截图,有便宜的2K就能搞定,好点的像这一款3K吧!) 码农这个词真不是瞎叫的,做这 ...
- redis 笔记03 RDB 持久化、AOF持久化、事件、客户端
RDB 持久化 1. RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据. 2. SAVE命令由服务器进程直接执行保存操作,所以该命令会阻塞服务器. 3. BGSAVE由子进程执行保 ...
- Tomcat 线程池配置
线程池 Executor代表了一个线程池,可以在Tomcat组件之间共享.使用线程池的好处在于减少了创建销毁线程的相关消耗,而且可以提高线程的使用效率.要想使用线程池,首先需要在 Service标签中 ...
- Arcgis Javascript API 开发笔记
JS API3.4的要求 à(1) IE9或以上版本 否则dijit1.8.3不匹配 1.如何发布ArcgisJavascript API应用 0.准备工作: (1).有web应用: (2).有js ...
- tar 解压命令学习与总结
tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个 ...
- Java值传递还是引用传递?
回顾: 在程序设计语言中,将参数传递分为按值调用和按引用调用.按值调用:表示方法接收的是调用者提供的值.而按引用调用表示方法接收的是调用者提供的变量地址.一个方法可以修改传递引用所对应的变量值,而不能 ...