• leetcode:Roman to Integer(罗马数字转化为罗马数字)


    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)

     1 class Solution13 {
     2     public int romanToInt(String s) {
     3         // Note: The Solution object is instantiated only once and is reused by each test case.
     4         int sum=0;
     5         String Temp="";
     6         int i=0;
     7         while(i<s.length()&&s.charAt(i)=='M'){
     8                 Temp+=s.charAt(i);          //这个循环的目的就是把表示千位上的罗马字母依次累加到Temp
     9                 i++;
    10             }
    11         sum+=1000*romanToOneNo(Temp, 4);
    12         Temp="";
    13         while(i<s.length()&&(s.charAt(i)=='C'||s.charAt(i)=='D'||s.charAt(i)=='M')){
    14             Temp+=s.charAt(i);           //这个循环的目的就是把表示百位上的罗马字母依次累加到Temp
    15             i++;
    16         }
    17         sum+=100*romanToOneNo(Temp, 3);
    18         Temp="";
    19         while(i<s.length()&&(s.charAt(i)=='X'||s.charAt(i)=='L'||s.charAt(i)=='C')){
    20             Temp+=s.charAt(i);          //这个循环的目的就是把表示十位上的罗马字母依次累加到Temp
    21             i++;
    22         }
    23         sum+=10*romanToOneNo(Temp, 2);
    24         Temp="";
    25         //System.out.println("The program is running");
    26         while(i<s.length()&&(s.charAt(i)=='I'||s.charAt(i)=='V'||s.charAt(i)=='X')){
    27             Temp+=s.charAt(i);               //这个循环的目的就是把表示个位上的罗马字母依次累加到Temp
    28             i++;
    29         }
    30         sum+=romanToOneNo(Temp, 1);
    31         return sum;
    32     }
    33     public int romanToOneNo(String s,int i){//这个函数的作用就是转化应该是i位上的字符串为单个的数,
    34         //s字符串表示的数转换后应该在i位上
    35         String str1,str2,str3;//拿0~9之间的数举例,str1表示I,str2表示V,str3表示X
    36         if(1==i){            //下面if语句是判断n是哪一位上的,依次用罗马数字表示1、5、10
    37             str1="I";        //个位上的数
    38             str2="V";
    39             str3="X";
    40         }
    41         else if(2==i){
    42             str1="X";       //十位上的数
    43             str2="L";
    44             str3="C";
    45         }else if(3==i){
    46             str1="C";       //百位上的数
    47             str2="D";
    48             str3="M";
    49         }else{
    50             str1="M";     //千位上的数,因为最大数到3999,所以str2和str3为空
    51             str2="";
    52             str3="";
    53         }
    54         if(s.equals(""))   //下面以个位数字0~9为例说明,如果字符串为空,返回0
    55             return 0;
    56         if(s.equals(str1))  //如果s为“I”
    57             return 1;
    58         if(s.equals(str1+str1)) //如果s为“II”
    59             return 2;
    60         if(s.equals(str1+str1+str1))//如果s为“III”
    61             return 3;
    62         if(s.equals(str1+str2))    //如果s为“IV”
    63             return 4;
    64            if(s.equals(str2))//如果s为“V”
    65              return 5;
    66         if(s.equals(str2+str1))//如果s为“VI”
    67             return 6;
    68         if(s.equals(str2+str1+str1))//如果s为“VII”
    69             return 7;
    70         if(s.equals(str2+str1+str1+str1))//如果s为“VIII”
    71             return 8;
    72         if(s.equals(str1+str3))  //如果s为“IX”
    73             return 9;
    74         return -1;         //如果以上条件都不符合,只能说明s不符合罗马数字的构词规则
    75     }
    76 }

     

     

  • 相关阅读:
    Android 性能测试_Monkey 实践
    Linux下 运行Jmeter (含一个jmeter简单示例)
    IOS测试-Fastmonkey
    iOSApp -Monkey测试
    如何用monkey测试IOS
    MVC系列开篇:(我的第一片博文)
    ASP.NET MVC 使用Swagger需要注意的问题!!!
    Urlparse模块
    从0到1:微信后台系统的演进之路(转自INFOQ)
    什么是商业模式?产品模式、用户模式、推广模式,最后是收入模式(转)
  • 原文地址:https://www.cnblogs.com/zhaolizhen/p/RomantoInteger.html
Copyright © 2020-2023  润新知