笔试题25. LeetCode OJ (12)


这道题的意思是将整形数字转化为罗马数字,只要了解了罗马数字的构成特点就知道怎么将整形数字转化为罗马数字,

转化规则如下:

个位数:

  Ⅰ【1】  Ⅱ【2】 Ⅲ【3】  Ⅳ【4 】  Ⅴ【5 】   Ⅵ【6】 Ⅶ【7】   Ⅷ【8】  Ⅸ【9】

  ·十位数举例

  Ⅹ【10】 Ⅺ【11】Ⅻ【12】 XIII【13】XIV【14】 XV【15】XVI【16】XVII【17】 XVIII【18】XIX【19】 XX【20】 XXI【21 】

        XXII【22 】 XXIX【29】 XXX【30】 XXXIV【34】  XXXV【35】 XXXIX【39】  XL【40】 L【50】 LI【51】 LV【55】  LX【60】 

LXV【65】LXXX【80】XC【90 】XCIII【93】 XCV【95】XCVIII【98】 XCIX【99】

  ·百位数举例

  C【100】 CC【200 】CCC【300 】CD【400】 D【500】DC【600】DCC【700】 DCCC【800】CM【900】  CMXCIX【999】

千位数举例

  M【1000】 MC【1100 】 MCD【1400 】 MD【1500】 MCM【1900】 MCMXC【1990】 MM【2000】  MMMCMXCIX【3999】

可以看出,和"4"和"9"相关的数字的地方都会出现“突变”,这就是罗马数字的特点,掌握了原则后我们很容易就会想到如下代码:

class Solution {
public:
    string intToRoman(int num) {
     // I(1)    V(5)    X(10)   L(50)   C(100)  D(500)  M(1000)
     //范围 1~3999
        string ret;
        if(num < 1 || num > 3999)
         {
             return ret;
         }
         
       
        if(num >= 1000)
        {
             int numofM = num/1000;
             for(int i=0; i < numofM ;++i)
             {
                 ret.push_back('M');
             }
             num-=1000*numofM;
        }
             
        if(num >= 500)
        {
            if(num >=900)
            {//CM(900)
                ret+="CM";
                num-=900;
            }
            else
            {
                ret.push_back('D');
                num-=500;
            }
        }
             
            
        if(num >= 100)
        {
            if(num >= 400)
            {
                ret+="CD";
                num-=400;
            }
            else
            {
                int numofC = num/100;
                for(int i=0;i<numofC;++i)
                {
                     ret.push_back('C');
                }
                num-=numofC*100;
            }
        }
         
        if(num >= 50)
        {//XC(90)
            if(num>=90)
            {
                ret+="XC";
                num-=90;
            }
            else
            {
                ret.push_back('L');
                num-=50;
            }
        }
             
        if(num >= 10)
        {
            if(num >= 40)
            {
                ret+="XL";
                num-=40;
            }
            else
            {
                int numofX = num/10;
                for(int i = 0; i < numofX; ++i)
                {
                    ret.push_back('X');
                }
                num-=10*numofX;
            }
        }
             
        if(num >= 5)
        {
            if(num == 9)
            {//9(IX)
                ret+="IX";
                num-=9;
            }
            else
            {
                ret.push_back('V');
                num-=5;
            }
        }
             
        if(num >= 1)
        {
            if(num == 4)
            {//4(IV)
                ret+="IV";
            }
            else
            {
                for(int i=0; i < num; ++i)
                {
                     ret.push_back('I');
                }
            }
            num=0;
        }
        
        return ret;
    }
};
上面的代码虽然比较长,但是通俗易懂,对每种特殊情况进行单独处理,还是可取的吧~



你可能感兴趣的:(LeetCode,C++,算法)