您的位置:首页 > 其它

LeetCode-13 Roman to Integer

2016-06-18 12:26 309 查看
https://leetcode.com/problems/roman-to-integer/

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.
1、罗马数字表示方法:

罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。记数的方法:

相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;在一个数的上面画一条横线,表示这个数增值 1,000 倍,如 

=5000。

2、map,每个元素与前一个元素比较,会有重复运算(88ms)

class Solution {

public:

    int romanToInt(string s) {

        typedef pair<char,int> p;

        map<char,int> m={

            p ('I',1),p ('V',5),p ('X',10),p ('L',50),p ('C',100),p ('D',500),p ('M',1000)

        };

        int len = s.size(),sum = m[s[0]],pre = sum;

        for(int i=1;i<len;i++){

            if(m[s[i]]<=pre)

                sum+=m[s[i]];

            else

                sum+=m[s[i]]-2*pre;

            pre = m[s[i]];

        }

        return sum;

    }

};

3、map,每个元素与后一个元素比较(68ms)

class Solution {

public:

    int romanToInt(string s) {

        typedef pair<char,int> p;

        map<char,int> m={

            p ('I',1),p ('V',5),p ('X',10),p ('L',50),p ('C',100),p ('D',500),p ('M',1000)

        };

        int len = s.size(),sum = 0;

        for(int i=0;i<len-1;i++){

            if(m[s[i]]<m[s[i+1]])

                sum-=m[s[i]];

            else

                sum+=m[s[i]];

        }

        return sum + m[s[len-1]];

    }

};

4、hash表,每个元素与后一个比较(36ms)

class Solution {

public:

    int romanToInt(string s) {

        typedef pair<char,int> p;

        int m[256];

        m['I'] = 1; m['V'] = 5; m['X'] = 10; m['L'] = 50; m['C'] = 100; m['D'] = 500; m['M'] = 1000;

        int len = s.size(),sum = 0;

        for(int i=0;i<len-1;i++){

            if(m[s[i]]<m[s[i+1]])

                sum-=m[s[i]];

            else

                sum+=m[s[i]];

        }

        return sum + m[s[len-1]];

    }

};

5、hash表,每个元素与后一个比较,减少重复计算(32ms,beat98.48%)

class Solution {

public:

    int romanToInt(string s) {

        int m[256];

        m['I'] = 1; m['V'] = 5; m['X'] = 10; m['L'] = 50; m['C'] = 100; m['D'] = 500; m['M'] = 1000;

        int len = s.size(),sum = 0,a ,b=m[s[0]];

        for(int i=0;i<len-1;i++){

            a = m[s[i]];

            b = m[s[i+1]];

            if(a < b)

                sum-=a;

            else

                sum+=a;

        }

        return sum + b;

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode