Question:

Given a roman numeral, convert it to an integer.

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

给一个罗马数字,把它转化成阿拉伯数字,可以保证罗马数字的输入在1到3999之间。

这个题和我上篇文章写的《leetcode:Integer to Roman(整数转化为罗马数字》正好相反,在上一篇文章中,我简单介绍了罗马数字的计数方法和组数规则,并举了一些例子,大家可以参考,在这里我再介绍。这个题我写的代码不简洁,甚至有些繁琐,但是思路简单明了,肯定还有更多比这更好的方法,但是它作为一种思路,也通过了leetcode的测试,愿意和大家分享一下,一起学习,共同进步。

算法基本思想:① 罗马构造数字有一定规律,虽然表示个位、十位、百位、千位的字母不同,但是这种规律相同,可以把这种构词规律写成一个函数 public int romanToOneNo(String s,int i),s表示构成罗马数字个位或者十位或者百位或者千位的罗马字母,i=1表示个位,i=2表示十位,i=3表示百位,i=4表示千位,经过这样的转换,可以转换成相应位上的数字。

       ② 在public int romanToInt(String s)中,s就是要转换的罗马字符串,下面的问题就转变为怎样分割字符串s,使个位、十位、百位、千位的字母分离出来。依次调用romanToOneNo(String s,int i)函数,就可以得到各位上的值。

       ③ 设计一个sum变量,对各位上的数乘以相应的1000、100、10、1,返回sum就可以了。

代码实现(java):

 class Solution13 {
public int romanToInt(String s) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int sum=0;
String Temp="";
int i=0;
while(i<s.length()&&s.charAt(i)=='M'){
Temp+=s.charAt(i); //这个循环的目的就是把表示千位上的罗马字母依次累加到Temp
i++;
}
sum+=1000*romanToOneNo(Temp, 4);
Temp="";
while(i<s.length()&&(s.charAt(i)=='C'||s.charAt(i)=='D'||s.charAt(i)=='M')){
Temp+=s.charAt(i); //这个循环的目的就是把表示百位上的罗马字母依次累加到Temp
i++;
}
sum+=100*romanToOneNo(Temp, 3);
Temp="";
while(i<s.length()&&(s.charAt(i)=='X'||s.charAt(i)=='L'||s.charAt(i)=='C')){
Temp+=s.charAt(i); //这个循环的目的就是把表示十位上的罗马字母依次累加到Temp
i++;
}
sum+=10*romanToOneNo(Temp, 2);
Temp="";
//System.out.println("The program is running");
while(i<s.length()&&(s.charAt(i)=='I'||s.charAt(i)=='V'||s.charAt(i)=='X')){
Temp+=s.charAt(i); //这个循环的目的就是把表示个位上的罗马字母依次累加到Temp
i++;
}
sum+=romanToOneNo(Temp, 1);
return sum;
}
public int romanToOneNo(String s,int i){//这个函数的作用就是转化应该是i位上的字符串为单个的数,
//s字符串表示的数转换后应该在i位上
String str1,str2,str3;//拿0~9之间的数举例,str1表示I,str2表示V,str3表示X
if(1==i){ //下面if语句是判断n是哪一位上的,依次用罗马数字表示1、5、10
str1="I"; //个位上的数
str2="V";
str3="X";
}
else if(2==i){
str1="X"; //十位上的数
str2="L";
str3="C";
}else if(3==i){
str1="C"; //百位上的数
str2="D";
str3="M";
}else{
str1="M"; //千位上的数,因为最大数到3999,所以str2和str3为空
str2="";
str3="";
}
if(s.equals("")) //下面以个位数字0~9为例说明,如果字符串为空,返回0
return 0;
if(s.equals(str1)) //如果s为“I”
return 1;
if(s.equals(str1+str1)) //如果s为“II”
return 2;
if(s.equals(str1+str1+str1))//如果s为“III”
return 3;
if(s.equals(str1+str2)) //如果s为“IV”
return 4;
if(s.equals(str2))//如果s为“V”
return 5;
if(s.equals(str2+str1))//如果s为“VI”
return 6;
if(s.equals(str2+str1+str1))//如果s为“VII”
return 7;
if(s.equals(str2+str1+str1+str1))//如果s为“VIII”
return 8;
if(s.equals(str1+str3)) //如果s为“IX”
return 9;
return -1; //如果以上条件都不符合,只能说明s不符合罗马数字的构词规则
}
}

leetcode:Roman to Integer(罗马数字转化为罗马数字)的更多相关文章

  1. LeetCode:Roman to Integer,Integer to Roman

    首先简单介绍一下罗马数字,一下摘自维基百科 罗马数字共有7个,即I(1).V(5).X(10).L(50).C(100).D(500)和M(1000).按照下述的规则可以表示任意正整数.需要注意的是罗 ...

  2. LeetCode: Roman to Integer 解题报告

    Roman to IntegerGiven a roman numeral, convert it to an integer. Input is guaranteed to be within th ...

  3. [LeetCode] Roman to Integer 罗马数字转化成整数

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

  4. [Leetcode] Roman to integer 罗马数字转成整数

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

  5. [Leetcode] 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 python

    class Solution(object): def romanToInt(self, s): """ :type s: str :rtype: int "& ...

  7. [LeetCode] Integer to Roman 整数转化成罗马数字

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

  8. [LeetCode] 12. Integer to Roman 整数转化成罗马数字

    Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...

  9. leetcode:Integer to Roman(整数转化为罗马数字)

    Question: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the rang ...

随机推荐

  1. O(1)时间内删除指定链表结点

    题目 给定单链表头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点. 分析 对于上图实例链表(a)删除指针p有两种方式 思路1:(b)找到前一个指针pre,赋值pre->next = ...

  2. 10位IT领袖给应届毕业生的10条忠告

    10位IT领袖给应届毕业生的10条忠告,在走向独立和自主的伟大征程中,吸取他们的经验. 在毕业生们迈出象牙塔之时,他们应该听从哪些人的建议?在走向独立和自主的伟大征程中,他们该吸取哪些教训?听一听各领 ...

  3. php常用代码(一)

    1.连接MYSQL数据库代码 <?php $connec=mysql_connect("localhost","root","root" ...

  4. 《Java编程那点事儿》读书笔记(五)——System,Integer,Calendar,Random和容器

    System 1)arraycopy int[] a = {1.2.3.4}; int[] b = new int[5]; System.arraycopy(a,1,b,3,2); //把数组a中从下 ...

  5. 正则表达式验证工具类RegexUtils.java

    Java 表单注册常用正则表达式验证工具类,常用正则表达式大集合. 1. 电话号码 2. 邮编 3. QQ 4. E-mail 5. 手机号码 6. URL 7. 是否为数字 8. 是否为中文 9. ...

  6. 《OD大数据实战》mac下安装nginx+php

    一.mac安装nginx + php + php-fpm  或apache + php 1. Mac 下 Nginx.MySQL.PHP-FPM 的安装配置 2. Mac下安装LNMP(Nginx+P ...

  7. URAL1204. Idempotents(扩展欧几里得)

    1204 大体推推 会出来这个式子 x(x-1) = k*n;n = p*q ;x(x-1)%(p*q)==0; 因为p,q都为素数 那也就是说x和x-1中必定包含这两个数 而且一个里面只能有一个 不 ...

  8. Android View绘制流程

    框架分析 在之前的下拉刷新中,小结过触屏消息先到WindowManagerService(Wms)然后顺次传递给ViewRoot(派生自Handler),经decor view到Activity再传递 ...

  9. POJ 1456 (贪心+并查集) Supermarket

    有n件商品,每件商品有它的利润和售出的最后期限,问能够得到的最大利润是多少 这道题和 HDU 1789 Doing Homework again 几乎一模一样,只不过这个是求最的扣分,本题是求最大利润 ...

  10. 解同余式ax ≡ c(mod m)

    将式子变形为 ax-c=my 可以看出原式有解当且仅当线性方程ax-my=c有解 设g = gcd(a, m) 则所有形如ax-my的数都是g的倍数 因此如果g不整除c则原方程无解. 下面假设g整除c ...