[LeetCode]Roman to Integer

本文介绍了一种将罗马数字转换为整数的算法实现,包括解析罗马数字的规则及两种不同的转换方法,并通过测试案例验证了算法的有效性。
题目说明:

Given a roman numeral, convert it to an integer.

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

 

程序代码:
#include <gtest/gtest.h>
using namespace std;

    //{'I','V','X','L','C','D','M','#','#'};
    //  1   5  10  50  100 500 1000

int getSingleRomanInt(char s)
{
    int nResult = 0;
    switch (s)
    {
    case 'I':
        nResult = 1;
        break;
    case 'V':
        nResult = 5;
        break;
    case 'X':
        nResult = 10;
        break;
    case 'L':
        nResult = 50;
        break;
    case 'C':
        nResult = 100;
        break;
    case 'D':
        nResult = 500;
        break;
    case 'M':
        nResult = 1000;
        break;
    }

    return nResult;
}

int romanToInt1(string s) 
{
    int nResult = 0;
    int nLength = s.length();
    if (nLength == 0)
    {
        return 0;
    }

    int nPre = getSingleRomanInt(s[0]);
    int nTemp = nPre;
    for (int i = 1; i < nLength; ++i)
    {
        int nCurrent = getSingleRomanInt(s[i]);
        if (nPre == nCurrent)
        {
            nTemp += nCurrent;
        }
        else if(nPre < nCurrent)
        {
            nTemp = nCurrent - nTemp;
        }
        else
        {
            nResult += nTemp;
            nTemp = nCurrent;
        }

        nPre = nCurrent;
    }

    nResult += nTemp;
    return nResult;
}

// 虽然罗马数字的书写规则较为复杂,但根据罗马数字“左加右减”的规律,
// 可以构造出更简单的罗马数字转换阿拉伯数字的方法:即从右向左(从低位向高位)考察罗马数字,
// 遇到比上一个数字大的数字就加上,遇到比上一个数字小的数字就减去。
int romanToInt(string s) 
{
    int nResult = 0;
    int nLength = s.length();
    if (nLength == 0)
    {
        return 0;
    }

    int nPre = 0;
    for (int i = nLength-1; i >=0; i--)
    {
        int nCurrent = getSingleRomanInt(s[i]);
        if (nCurrent < nPre)
        {
            nResult -= nCurrent;
            nPre = nCurrent;
        }
        else
        {
            nResult += nCurrent;
            nPre = nCurrent;
        }
    }

    return nResult;
}

TEST(Pratices, tRomanToInt)
{
    // DLLXXXVII => 687
    ASSERT_EQ(romanToInt("DCLXXXVII"),687);

    // CCI => 201
    ASSERT_EQ(romanToInt("CCI"),201);

    // MMMCMXCIX => 3999
    ASSERT_EQ(romanToInt("MMMCMXCIX"),3999);

    // CDLVI => 456
    ASSERT_EQ(romanToInt("CDLVI"),456);

    // XCIX => 99
    ASSERT_EQ(romanToInt("XCIX"),99);

    ASSERT_EQ(romanToInt("IV"),4);
}
参考相关:

http://articles.leetcode.com/palindrome-number

转载于:https://www.cnblogs.com/Quincy/p/5315513.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值