[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,先求得去掉千位后的数字,再求百位数。以此类推。
AC Code:
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函数模块化,不需要判断具体指向的字符的位置,我们将移动后的数组首地址传给函数。
3. 用C的数组存储字符。
复杂度:O(N)
AC Code:
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;
}
};
相关文章推荐
- leetcode_c++: Integer to Roman(012)
- LeetCode上Roman to Integer的C++代码
- [C++]LeetCode 12: Integer to Roman(将整数转换为罗马数字)
- leetcode_c++:Roman to Integer(013)
- leetcode_13_Roman to Integer(C++)(easy)
- [C++]LeetCode: 16 Roman to Integer
- LeetCode刷题(C++)——Integer to Roman(Medium)
- LeetCode刷题(C++)——Roman to Integer(Easy)
- 【leetcode c++】13 Roman to Integer
- LeetCode 12 — Integer to Roman(C++ Java Python)
- leetcode 13 Roman to Integer C++
- [LeetCode]Integer to Roman
- LeetCode Integer to Roman
- [LeetCode] Integer to Roman 解题报告
- [leetCode] Integer to Roman
- leetcode roman to integer
- LeetCode: Integer to Roman
- LeetCode: Integer to Roman
- [Leetcode] Roman to Integer
- LeetCode: Roman to Integer