[LeetCode] #12 Integer to Roman 解題
題型解說
這是一題難度為普通的題目
需要設計一個方法,此方法會傳入一個整數 num
要求是把整數轉換成羅馬字母,轉換清單如下
I => 1
V => 5
X => 10
L => 50
C => 100
D => 500
M => 1000
但羅馬字母有一些特殊規則
4 並非 IIII 而是 IV,9 並非 VIIII 而是 IX
這規則同樣可以套用到 40 90 400 900
解題思路
既然知道特殊規則是一樣的,變得是使用的符號,那麼先從 num 取個位數開始
轉換完成後,把 num 除上 10,消除個位數,原本的十位數就變成個位數了(Java 特性,整數除上整數還是整數)
再重複以上的動作(只需要換符號)即可完成整套轉換
程式碼
Java
class Solution {
public String intToRoman(int num) {
StringBuilder sb = new StringBuilder();
part(sb, num % 10, "I", "V", "X");
num /= 10;
part(sb, num % 10, "X", "L", "C");
num /= 10;
part(sb, num % 10, "C", "D", "M");
num /= 10;
repeat(sb, "M", num);
return sb.toString();
}
private void part(StringBuilder sb, int num, String one, String five, String ten) {
if (num < 5) {
if (num == 4) {
sb.insert(0, one + five);
} else {
repeat(sb, one, num);
}
} else {
if (num == 9) {
sb.insert(0, one + ten);
} else {
repeat(sb, one, num % 5);
sb.insert(0, five);
}
}
}
private void repeat(StringBuilder sb, String target, int times) {
for (int i = 0; i < times; i++) {
sb.insert(0, target);
}
}
}
更好的解法
另外一種方式是利用查表的方式來轉換,簡單說就是事先建立好每一個數字對應的符號,然後利用迴圈來轉換
程式碼
Java
class Solution {
public String intToRoman(int num) {
int number[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
String roman[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
StringBuffer numToroman = new StringBuffer();
for (int i = 0; i < number.length; i++) {
while (num >= number[i]) {
num = num - number[i];
numToroman.append(roman[i]);
}
}
return numToroman.toString();
}
}