Roman to Integer

Given a roman numeral, convert it to an integer.

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

意思就是:

给出一个罗马数字,返回其对应的整数 num( 0<=num<=3999)表示;

罗马数字范围从 0-->3999

罗马数字有:

I V X L C D M
1 5 10 50 100 500 1000

Solutions

  • 1 Roman to Integer -- 59ms

    • 这种方法是对罗马数字从头到尾的扫描一遍。分析一下可以知道,只有 49 才会出现小一点的罗马数字出现在大的罗马数字的前面!比如:CD=400 其中 C=100 , D=500 ,此时需要的后一个罗马数字减去前面一个罗马数字,其他情况都是一直加的。代码如下:
    class Solution {
    public:
    int romanToInt(string s) {
    int idx=0,n=s.length();
    if(s.length()<=0)return 0; string roman="IVXLCDM";
    int nums[] ={1,5,10,50,100,500,1000};
    int res=0;
    //idx=roman.find(s.at(0));
    //if(idx<0||idx>6)return 0;
    //if(n==1){
    //return nums[idx];
    //}
    int num1,num2;
    idx=0;
    while(idx<n-1){ // 需要考虑 idx+1 的越界情况
    num1=roman.find(s[idx]);
    num2=roman.find(s[idx+1]);
    if(num2>num1){
    res=res+(nums[num2]-nums[num1]);
    idx+=2;
    }else{
    res=res+nums[num1];
    ++idx;
    }
    }
    if(n-1==idx){ //需要考虑可能剩下的最后一个罗马数字
    num1=roman.find(s[n-1]);
    res+=nums[num1];
    }
    return res;
    }
    };
  • 2 Roman to Integer -- 49ms

    • 方案1中需要考虑 idx+1 的越界情况,所以还要在最后再增加一个判断,且使用的是从前向后扫描罗马数字字串;那如果是从后向前扫描罗马数字字串呢?思想会不会简单一点呢?分析一下可以看出,从后向前扫描,可以一直加下去,除了一种情况:当前扫描的数小于上一个扫描的数!也就是说只有这一个条件了,不需要再判断什么越不越界的问题了。如:MCMVI=1906 , 扫描 VV>I(在罗马数字中,以下同),所以直接加,结果为:6,扫描 M 也一样,结果为1006,接下来扫描到 C ,此时 C<M ,所以应是减去 C ,结果是906,最后再加 M ,得到结果:1906。要做的,只是记录下上一次的罗马数字。代码如下:
    class Solution {
    public:
    int romanToInt(string s) {
    if(s.length()<=0)return 0;
    string roman="IVXLCDM";
    int nums[] ={1,5,10,50,100,500,1000};
    int n=s.length();
    int res=0, idx=n-1, pre=0, ndx;
    while(idx>=0){
    ndx=roman.find(s[idx]);
    if(pre>ndx){
    res-=nums[ndx];
    }else{
    res+=nums[ndx];
    }
    pre=ndx;
    --idx;
    }
    return res;
    }
    };
  • 3 Roman to Integer -- 53ms

    • 查阅了网友的解答,发现这一个方式挺好的,思路也很简单:

      • 逐个遍历罗马数字串,根据当前遍历到的字符,进行对应的累加操作。
      • 罗马数字共 7 个符号,IVXLCDM ,如果遍历到罗马数字 w ,则判断之前已经求出的数字 res 是否小于 w ,如果小于,则 加上 w :res=res+w,否则减去 w 。原因是:因为是从后向前遍历,所以我们已经遍历出来的数字肯定是会小于下一进位的数字的,比如 189 ,89再大,也没有100大!所以此算法使用的就是这种思想,一旦出现违法了这种情况,那就是出现了 4 或者 9 的情况。说明我们加多了,那就要减去。说的可能比较不好完全理解,看代码:
    class Solution {
    public:
    int romanToInt(string s) {
    int res = 0 ,n=s.length();
    for (int i = n - 1; i >= 0; --i) {
    char c = s.at(i);
    switch (c) {
    case 'I':
    res += (res >= 5 ? -1 : 1);
    break;
    case 'V':
    res += 5;
    break;
    case 'X':
    res += 10 * (res >= 50 ? -1 : 1);
    break;
    case 'L':
    res += 50;
    break;
    case 'C':
    res += 100 * (res >= 500 ? -1 : 1);
    break;
    case 'D':
    res += 500;
    break;
    case 'M':
    res += 1000;
    break;
    }
    }
    return res;
    }
    };
  • 看了一下其他的代码,大致的思想都是上面的方法,可能还有我没发现的。只是代码编写的形式不同而已。

附录

同系列:LeetCodesOJhttp://www.cnblogs.com/lomper/tag/LeetCodesOJ/

LeetCodeOJ刷题之13【Roman to Integer】的更多相关文章

  1. 【leetcode刷题笔记】Roman to Integer

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

  2. leetCode练题——13. Roman to Integer

    1.题目13. Roman to Integer Roman numerals are represented by seven different symbols: I, V, X, L, C, D ...

  3. 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 ,即 ...

  4. leecode刷题(13) -- 字符串中的第一个唯一字符

    leecode刷题(13) -- 字符串中的第一个唯一字符 字符串中的第一个唯一字符 描述: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = & ...

  5. Leetcode 13. Roman to Integer(水)

    13. Roman to Integer Easy Roman numerals are represented by seven different symbols: I, V, X, L, C, ...

  6. 《LeetBook》leetcode题解(13):Roman to Integer[E]

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  7. C# 写 LeetCode easy #13 Roman to Integer

    13.Roman to Integer Roman numerals are represented by seven different symbols: I, V, X, L, C, D and  ...

  8. 13. Roman to Integer【leetcode】

    Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within t ...

  9. 【LeetCode】13. Roman to Integer (2 solutions)

    Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within t ...

随机推荐

  1. 下厨房---map/字符串查询

    题目描述 牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料. 输入描述: 每个输入包含 1 个测试用例.每个测试用例的第 i 行,表示完成第 i 件料理需要 ...

  2. linux 文件截取

    相关函数:open, ftruncate 表头文件:#include <unistd.h> 定义函数:int truncate(const char *path, off_t length ...

  3. VUE--mixins的一些理解。

    概念:混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 用法: 1.创建混 ...

  4. for循环注意案例

    1.在for循环中,三个表达式都可以省略,但是分号必须编写,但会出现死循环(无限循环) 2.在for循环中,省略表达式1,则出现编译错误,解决办法:在表达式1编写在for循环上面 3.在for循环中, ...

  5. svn checkout时连接不到服务器,重装也没有弹出用户名和密码输入框的问题

    用公司的电脑,是win7 64位的系统,可以checkout出东西.现在用自己的电脑上,系统是win7 64位的,却再也连不上SVN. 1.不提示输入用户名和密码,不管重装多少次都一样. 2.Tort ...

  6. 通过JavaScript动态生成html控件

    示例代码 <html> <head> <meta http-equiv="Content-Type" content="text/html& ...

  7. linux查看占用内存最多的程序

    1.linux查看占用内存最多的程序 ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head 2.查看占用cpu最多的程序 ps aux|head ...

  8. 深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(The Dependency Inversion Principle ). 英文原文:htt ...

  9. windows下快速修改host文件

    windows下快速修改host文件 win+r  输入 notepad c:\Windows\System32\drivers\etc\hosts

  10. C# 判断List集合中是否有重复的项

    /*在.Net 3.5 以上*/ ).Count() >= ;