[leet code] Integer to Roman

Given an integer, convert it to a roman numeral.

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

=========

Analysis:

2 key points:

1. The match between roman numeral and int:

I = 1

V = 5

X = 10

L = 50

C = 100

D = 500

M = 1000

In order the deal with the "append left" cases (e.g. 4 = IX, 40 = XL, etc.), we extend the matches as follow: (the most simplest method I could find to deal with these cases)

IV = 4

IX = 9

XL = 40

XC = 90

CD = 400

CM = 900


2. Use StringBuffer to store the result string (dynamic length), and return by .toString() method.

public class Solution {
    public String intToRoman(int num) {
        if(num == 0) return null;
        
        StringBuffer sb = new StringBuffer();

            int numM = num/1000;
            if(numM > 0){
                num -= numM*1000;
                for (int i=1; i<=numM; i++) sb.append('M');
            }

            int numCM = num/900;
            if(numCM > 0){
                num -= numCM*900;
                for (int i=1; i<=numCM; i++) sb.append("CM");
            } 
            
            int numD = num/500;
            if(numD > 0){
                num -= numD*500;
                for (int i=1; i<=numD; i++) sb.append('D');
            } 

            int numCD = num/400;
            if(numCD > 0){
                num -= numCD*400;
                for (int i=1; i<=numCD; i++) sb.append("CD");
            } 
            
            int numC = num/100;
            if(numC>0){
                num -= numC*100;
                for (int i=1; i<=numC; i++) sb.append('C');
            } 

            int numXC = num/90;
            if(numXC>0){
                num -= numXC*90;
                for (int i=1; i<=numXC; i++) sb.append("XC");
            } 
            
            int numL = num/50;
            if(numL>0){
                num -= numL*50;
                for (int i=1; i<=numL; i++) sb.append('L');
            } 
            
            int numXL = num/40;
            if(numXL>0){
                num -= numXL*40;
                for (int i=1; i<=numXL; i++) sb.append("XL");
            } 
            
            int numX = num/10;
            if(numX>0){
                num -= numX*10;
                for (int i=1; i<=numX; i++) sb.append('X');
            } 

            int numIX = num/9;
            if(numIX>0){
                num -= numIX*10;
                for (int i=1; i<=numIX; i++) sb.append("IX");
            }
            
            int numV = num/5;
            if(numV>0){
                num -= numV*5;
                for (int i=1; i<=numV; i++) sb.append('V');
            } 
            
            int numIV = num/4;
            if(numIV>0){
                num -= numIV*4;
                for (int i=1; i<=numIV; i++) sb.append("IV");
            } 
            
            int numI = num;
            if(numI>0){
                for (int i=1; i<=numI; i++) sb.append('I');
            } 
            
            return sb.toString();
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值