您的位置:首页 > 其它

[leetcode]Integer to Roman

2013-08-29 23:49 281 查看
整数转罗马数字,这道题目对我们中国人来说是很郁闷的,因为不熟悉。但确实也有面试官考,所以复习一下。首先罗马数字的定义参见:http://baike.baidu.com/link?url=aDx5F_QUGwk0DIbgeLxvu0YX1RDUjETI67bdJSaNxDcWCdpZVK_DH_54IIq7Z-w-

可以看到,其实就是1~9的循环表示,用不同的字符集。那么比较容易想到的就是下面这个方法。

public class Solution {
public String intToRoman(int num) {
char[] roman = new char[] {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
StringBuilder sb = new StringBuilder();
int scale = 1000;
for (int i = 6; i >= 0; i -= 2)
{
if (num == 0) break;
int c = num / scale;
if (c <= 3)
{
for (int j = 0 ; j < c; j++)
{
sb.append(roman[i]);
}
}
else if (c == 4)
{
sb.append(roman[i]);
sb.append(roman[i+1]);
}
else if (c == 5)
{
sb.append(roman[i+1]);
}
else if (c <= 8)
{
sb.append(roman[i+1]);
for (int j = 0 ; j < c-5; j++)
{
sb.append(roman[i]);
}
}
else if (c == 9)
{
sb.append(roman[i]);
sb.append(roman[i+2]);
}
num = num - c * scale;
scale = scale / 10;
}
return sb.toString();
}
}


除此之外,还看到这么一个方法,比较巧妙需要思考一下。其实就是从大到小试探可能性,比如拿10以内的举例:10,9,5,4,1都是坎。到不了这一级,就只能下一个,比如8,到不了9,就先放个5,剩下的3也到不了4,就只能用1来表示。

class Solution {
public:
string intToRoman(int num) {
string res;
string symbol[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int value[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};

int i = 0;
while(num != 0){
if(num >= value[i]){    // minus largest number
num -= value[i];
res += symbol[i];
} else {
i++;
}
}
return res;
}
};


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