您的位置:首页 > 编程语言 > C语言/C++

[C++]LeetCode: 85 Integer to Roman

2015-01-10 16:24 627 查看
题目:

Given an integer, convert it to a roman numeral.

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

Roman to Integer这道是对应的。

Answer 1: 查表法

思路:由于罗马数字左减不允许跨位表示,说明罗马数字是按照十进制的位数分开表示的。

举例子:99不可以用IC(

)表示,而是用XCIX(

)表示。(等同于阿拉伯数字每位数字分别表示。)我们利用罗马数字这个性质,可以建立一个查找表,并且题目中规定数字不超过3999(不需要加横线),则我们建立四个数组,分别表示千位(0~1000~3000),百位(0~100~900),十位(0~10~90),个位(0~1~9)。

Attention:

1.注意每一位的确定,千位是num/1000,百位是(num%1000)/100,先求得去掉千位后的数字,再求百位数。以此类推。

ret = Mtable[num/1000] + Ctable[(num%1000)/100] + Xtable[(num%100)/10] + Itable[num%10];
复杂度:O(1),时间复杂度O(1)

AC Code:

class Solution {
public:
string intToRoman(int num) {
//利用罗马数字不能跨位表示 每一个位是分别表示的,我们可以建立一个表

//0~1000~3000,0~100~900,0~10~90,0~1~9
vector<string> Mtable{"", "M", "MM", "MMM"};
vector<string> Ctable{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
vector<string> Xtable{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
vector<string> Itable{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

string ret;
ret = Mtable[num/1000] + Ctable[(num%1000)/100] + Xtable[(num%100)/10] + Itable[num%10];
return ret;
}
};


Answer 2:
思路:我们注意到罗马数字的字母是有规律的,可以分成几组,I(1),V(5)是一组,X(10),L(50)是一组,C(100),D(500)是一组,M(1000),V(V加一个上划线,表示5000).并且后一组的两个数是前一组的10倍。
对于大于10的整数,我们把整数逐位表示成罗马数字。
个位上的数字1~9的分别为: I II III IV V VI VII VIII IX

十位上的数字1~9,只要把原来个位的I替换成X, V替换成L,X替换成C,即十位上的1~9表示10~90.
以此类推,百位,千位,我们可以得到罗马表示。
Attention:
1. 我们从千位到百位,十位,个位,依次表示。
2. 为了使helper函数模块化,不需要判断具体指向的字符的位置,我们将移动后的数组首地址传给函数。
//此处第二个参数是把数组的首地址传给辅助函数
            intToRoman_helper(num/factor, &romanChar[startIdx], ret);

else if( k <= 8)
        {
            ret.push_back(romanChar[1]);
            ret.append(k-5, romanChar[0]);
        }

3. 用C的数组存储字符。
char romanChar[] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
4. if...else语句,执行顺序是有影响的,顺序执行下来,如果进入某个语句块,并完成,就会结束if语句。所以各条件不用互斥。
if(k <= 0)
            return;
        else if( k <= 3)
        { }
        else if( k == 4)
        { }
        else if( k <= 8)
        { }
        else if( k == 9)
        { }
5. string append函数

string& append (size_t n, char c);


复杂度:O(N)
AC Code:
class Solution {
public:
string intToRoman(int num) {
char romanChar[] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
string ret;

int startIdx = 6;
int factor = 1000;
while(num != 0)
{
//此处第二个参数是把数组的首地址传给辅助函数 intToRoman_helper(num/factor, &romanChar[startIdx], ret);
num %= factor;
startIdx -= 2;
factor /= 10;
}

return ret;
}

private:
void intToRoman_helper(int k, char romanChar[], string& ret)
{
if(k <= 0)
return;
else if( k <= 3)
{
ret.append(k, romanChar[0]);
}
else if( k == 4)
{
ret.push_back(romanChar[0]);
ret.push_back(romanChar[1]);
}
else if( k <= 8) { ret.push_back(romanChar[1]); ret.append(k-5, romanChar[0]); }
else if( k == 9)
{
ret.push_back(romanChar[0]);
ret.push_back(romanChar[2]);
}

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