zoukankan      html  css  js  c++  java
  • 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代替Ⅳ。

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

     1 class Solution {
     2 public:
     3     int romanToInt(string s) {
     4         int prev, curr, result, tmpResult;
     5         prev = curr = result = tmpResult = 0;
     6         int sz = s.size();
     7         if(sz == 0)
     8             return 0;
     9         tmpResult = prev = getRoman(s[0]);
    10         for(int i = 1; i < sz; ++i){
    11             curr = getRoman(s[i]);
    12             if(curr > prev)
    13                 tmpResult =  curr - prev;
    14             else if(curr == prev)
    15                 tmpResult += curr;
    16             else{
    17                 result += tmpResult;
    18                 tmpResult = curr;
    19             }
    20             prev = curr;
    21         }
    22         return result + tmpResult;
    23     }
    24     
    25     int getRoman(char c)
    26     {
    27         switch(c){
    28             case 'I':
    29                 return 1; 
    30             case 'V':
    31                 return 5; 
    32             case 'X':
    33                 return 10; 
    34             case 'L':
    35                 return 50;
    36             case 'C':
    37                 return 100;
    38             case 'D':
    39                 return 500;
    40             case 'M':
    41                 return 1000;//题目说了,最多只能到4999,不用取更大的了 
    42             default:
    43                 return 0;
    44         }
    45     }
    46 };

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

     1 public class Solution {
     2     public int romanToInt(String s) {
     3          int prev, curr, tmpRes, ret;
     4          prev = curr = tmpRes = ret = 0;
     5          int sz = s.length();
     6          if(sz == 0)
     7              return 0;
     8          tmpRes = prev = RToI(s.charAt(0));
     9          for(int i = 1; i < sz; ++i){
    10              curr = RToI(s.charAt(i));
    11              if(curr < prev){
    12                  ret += tmpRes;
    13                  tmpRes = curr;
    14              }else if(curr > prev){
    15                  tmpRes = curr - prev;
    16              }else{
    17                  tmpRes += curr;
    18              }
    19              prev = curr;
    20          }
    21          return ret + tmpRes;
    22     }
    23 
    24     public int RToI(char c){
    25         switch(c){
    26             case 'I':
    27                 return 1;
    28             case 'V':
    29                 return 5;
    30             case 'X':
    31                 return 10;
    32             case 'L':
    33                 return 50;
    34             case 'C':
    35                 return 100;
    36             case 'D':
    37                 return 500;
    38             case 'M':
    39                 return 1000;//给出数字小于5000,无需在大
    40             default:
    41                 return 0;
    42         }
    43     }
    44 }



  • 相关阅读:
    ASP.NET MVC5 生成验证码
    System.Web.Caching.Cache类 Asp.Net缓存 各种缓存依赖
    ASP.NET访问网络驱动器(映射磁盘)
    ASP.NET Cache 实现依赖Oracle的缓存策略
    目前主流的四大浏览器内核Trident、Gecko、WebKit以及Presto
    ASP.NET 5 改名 ASP.NET Core 1.0
    C# 7.0新加特性
    elasticsearch 单实例安装启动
    关于mybatis 一级缓存引发的问题
    关于springboot 打包问题 jar包和 war包
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4860779.html
Copyright © 2011-2022 走看看