Thursday, September 10, 2015

[Math]Integer to Roman

1. Exmaple
// NOTE: avoid call stack don't put call within loop
s= 1700 = >"MDCC"

s= 24 => "XXIV"

s= 19 => "XIX"

s= 900=>"CM"


2. Implementation
Q1: care for for number 4 and 9
// NOTE: avoid call stack don't put call within loop
List digits = new ArrayList();

digits.add(num/divisor);


StringBuilder res = new StringBuilder(); 

res.append( convert(digits.get(0), 'M', '','') ); 
res.append( convert(digits.get(1), 'C', 'D', 'M') ); 
 res.append( convert(digits.get(2), 'X', 'L', 'C') ); 
 res.append( convert(digits.get(3), 'I', 'V', 'X') );

// NOTE: start from 5 can merge case 5 into here
 for (int i = 5; i< digit;i++)
default: //return ""; 
 // NOTE: return string all in bottom, so just BREAK 
default:
 break;



public String intToRoman(int num)
{



     //validate the input
     if ( num < 0 )
          return "";




         
     int divisor = 1000;
     



     // NOTE: use a data structure to store the digits you want to print out
     List digits = new ArrayList();




     while ( divisor > 0)
     {
         //int digit = num /divisor;
         digits.add(num/divisor);

         // NOTE: avoid call stack don't put call within loop
         //if ( divisor == 1000 )
         //{
         //     res.append();
         //}
         //else if ( divisor == 100)
         //{
         //     res.append();
         //}
         //else if ( divisor =10 )
         //{
         //     res.append();
         //}
         //else if ( divisor ==1)
         //{
         //     res.append();
         //} 


         //num/=divisor;
         num%= divisor;
         divisor/=10;

     }



    

     StringBuilder res = new StringBuilder();
     res.append( convert(digits.get(0), 'M', '','') );
     res.append( convert(digits.get(1), 'C', 'D', 'M') );
     res.append( convert(digits.get(2), 'X', 'L', 'C') );
     res.append( convert(digits.get(3), 'I', 'V', 'X') );


     
     return res.toString();



}
public String convert (int digit, char one, char five, char ten)
{
       
      StringBuilder sb = new StringBuilder();
 
     
      switch(digit)
      {
           case 1:
           case 2:
           case 3:
               for ( int i =0; i < digit ; i++)
               {
                   sb.append(one);
               }        
               break;
           case 4:
               sb.append(one);
               sb.append(five);
               break;
           case 5:
               //sb.append(five);
               //break;
           case 6: 
           case 7:
           case 8:
               sb.append(five);
               //for (int i=0;i< digit -5;i++)
               // NOTE: start from 5 can merge case 5 into here
               for (int i = 5; i< digit;i++)
               {
                   sb.append(one);
               }
               break;
           case 9:
               sb.append(one);
               sb.append(ten);           
               break;
           default:
               //return "";
               // NOTE: return string all in bottom, so just BREAK
               break;
      }


      return sb.toString();


}

3. Similar Ones
(E) Roman to Integer
(M) Integer to English Words

No comments:

Post a Comment