【C++】将罗马数字转换成阿拉伯数字
来源:互联网 发布:lua软件使用 编辑:程序博客网 时间:2024/05/17 16:55
题目:Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
将罗马数字转换成阿拉伯数字。
方法一:
从前往后的计算,规则如下:1,小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数
2,小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数
代码如下:
int romanToInt(string s) { map<char,int> saluota{{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}}; int length = s.length(); if(length==1) return saluota[s[0]]; int i=0,temp,sum=0; while(i<length){ if(saluota[s[i]] < saluota[s[i+1]] ){ temp=saluota[s[i+1]]-saluota[s[i]]; i+=2; } else{ temp=saluota[s[i]]; i++; } sum+=temp; if(i+2>=length) break; } if(saluota[s[i]] < saluota[s[i+1]]){ sum+=saluota[s[i+1]]-saluota[s[i]]; } else sum+=saluota[s[i+1]]+saluota[s[i]]; return sum;}
弊端:实现比较复杂,而且有当x=”IX”的时候,在CodeBlocks下面输出是9,但是在LeedCode下面输出是109,很奇怪。
方法二:从后往前计算,若是后一个比前一个小,那么就sum直接加上,若是后一个比前一个小,那么大数减小数之后在sum加上。
代码如下:
int romanToInt2(string s) { map<char,int> saluota{{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}}; int length=s.length(); if(length==1) return saluota[s[0]]; int i=0,sum=saluota[s[length-1]]; for(i=length-2;i>=0;i--){ if(saluota[s[i]]>=saluota[s[i+1]]) sum+=saluota[s[i]]; else sum-=saluota[s[i]]; } return sum;}
Leetcode上通过了。
优点点是很代码简洁,也比较容易计算。但是缺点是不容易想到。不知道如何复现,可能下次同类型的题目还是不知道用这种方法。
阅读全文
0 0
- 【C++】将罗马数字转换成阿拉伯数字
- 将罗马数字转换成阿拉伯数字
- 将阿拉伯数字转换成罗马数字
- 将罗马数字转换成普通的阿拉伯数字
- Javascript 将阿拉伯数字转换成罗马数字
- 罗马数字转换成阿拉伯数字
- 阿拉伯数字转换成罗马数字
- 阿拉伯数字转换成罗马数字
- 罗马数字转换成阿拉伯数字
- 将阿拉伯数字转换为罗马数字
- 将阿拉伯数字转换为罗马数字
- 将阿拉伯数字转换成罗马数字 Integer to Roman
- 罗马数字转换为阿拉伯数字
- 将1到1000的阿拉伯数字转换为罗马数字
- 试题:将阿拉伯数字转为罗马数字
- 试题:将罗马数字转为阿拉伯数字
- 将阿拉伯数字 翻译为 罗马数字
- 罗马数字与阿拉伯数字相互转换
- 一步步写操作系统(三) C语言和asm语言的相互调用
- 51nod-1081[前缀和]子段求和
- GROMACS运行参数整理(二)
- springBoot idea 热部署
- LWC 56:719. Find K-th Smallest Pair Distance
- 【C++】将罗马数字转换成阿拉伯数字
- 1-关于他的四本书
- Java实现图的深度优先遍历和广度优先遍历
- 奇异值分解(SVD)和主成分分析(PCA)
- java基础
- 原生javascript截取url中的参数方法
- Hibernate持久化对象的三个状态
- linux下安装mysql以及远程sql工具连接mysql
- 安卓各版本代号与API级别对应表