您的位置:首页 > 其它

[leetcode 12] Inter to Roman

2015-06-10 18:47 323 查看
1 题目:

Given an integer, convert it to a roman numeral.

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

Hide Tags
Math String

2 思路:
经过我仔细研读维基百科的说明https://zh.wikipedia.org/wiki/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97,我发现规则好复杂,如下:

重复数次:一个罗马数字重复几次,就表示这个数的几倍。

右加左减:

在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。

在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。

左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV

但是,左减时不可跨越一个位数。比如,99不可以用IC(

)表示,而是用XCIX(

)表示。(等同于阿拉伯数字每位数字分别表示。)

左减数字必须为一位,比如8写成VIII,而非IIX。

右加数字不可连续超过三位,比如14写成XIV,而非XIIII。(见下方“数码限制”一项。)

加线乘千:

在罗马数字的上方加上一条横线或者加上下标的Ⅿ,表示将这个数乘以1000,即是原数的1000倍。

同理,如果上方有两条横线,即是原数的1000000(

)倍。

数码限制:

同一数码最多只能出现三次,如40不可表示为XXXX,而要表示为XL。

例外:由于IV是古罗马神话主神朱庇特(即IVPITER,古罗马字母里没有J和U)的首字,因此有时用IIII代替IV。

想了想用if-else确定范围太难了。好吧,结果我看别人的答案,可以直接按位来确定罗马数字。(维基百科也没说可以这样转换。。)
https://leetcode.com/discuss/32626/simple-solution

3 代码:

public String intToRoman(int num) {
String[] M = {"","M","MM","MMM"};
String[] C = {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
String[] X = {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
String[] V = {"","I","II","III","IV","V","VI","VII","VIII","IX"};

return M[num/1000] + C[(num%1000)/100] + X[(num%100)/10] + V[num%10];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: