Rimska do cijele obraćenja

Rimska do cijele obraćenja
Isprobajte na GFG praksi

S obzirom na niz s koji predstavlja rimski broj, pronađite odgovarajuću cijelu vrijednost.
Rimski brojevi formiraju se pomoću sljedećih simbola: i = 1 v = 5 x = 10 l = 50 c = 100 d = 500 i m = 1000.
Brojevi se obično formiraju kombiniranjem ovih simbola s lijeva na desno dodavanje ili oduzimanje njihovih vrijednosti na temelju određenih pravila.

Kako funkcionira pretvorba?

  • Ako dođe simbol manje vrijednosti prije nego što oduzmemo. Inače dodajemo.
  • U IV I dolazi prije nego što su V i V ima veću vrijednost 5. Dakle, naš rezultat je 5 - 1 = 4.
  • U vi V dolazi prije nego i ja imamo manju vrijednost 1. Dakle, naš rezultat je 5 + 1 = 6.
  • U II imamo iste vrijednosti, pa dodamo i dobivamo 1 + 1 = 2
  • U slučaju više od 2 znaka, prelazimo s lijeva na desno i grupiramo se samo kad vidimo karakter veće vrijednosti nakon karaktera manje vrijednosti. Na primjer, mxvii je 1000 + 10 + 5 + 1 + 1 = 1017., A xlvii je (50 - 10) + 5 + 1 + 1 = 47. Imajte na umu da je l veći i dolazi nakon X.

Primjeri:

Ulazni: s = 'ix'
Izlaz: 9
Obrazloženje: Ix je rimski simbol koji predstavlja 10 - 1 = 9

Ulazni: s = 'xl'
Izlaz: 40
Obrazloženje: XL je rimski simbol koji predstavlja 50 - 10 = 40

Ulazni: s = 'mcmiv'
Izlaz: 1904
Obrazloženje: M je 1000 cm je 1000 - 100 = 900, a IV je 4. Dakle, imamo ukupno 1000 + 900 + 4 = 1904

Tablica sadržaja

[Očekivani pristup 1] Korištenje iterativne usporedbe - O (n) Vrijeme i O (1) Prostor

Ideja za pretvaranje rimskog broja u cijeli broj je da moramo preći niz s lijeva na desno. Za svaki simbol usporedite ga sa sljedećim simbolom (ako postoji). Ako je trenutni simbol veći ili jednak sljedećem simbolu, dodajte njegovu vrijednost rezultatu. Inače oduzmite njegovu vrijednost od vrijednosti sljedećeg simbola i dodajte rezultat ukupno i preskočite sljedeći simbol.

C++
   #include          using     namespace     std  ;   // this function returns value of a Roman symbol   int     value  (  char     r  )     {      if     (  r     ==     'I'  )      return     1  ;      if     (  r     ==     'V'  )      return     5  ;      if     (  r     ==     'X'  )      return     10  ;      if     (  r     ==     'L'  )      return     50  ;      if     (  r     ==     'C'  )      return     100  ;      if     (  r     ==     'D'  )      return     500  ;      if     (  r     ==     'M'  )      return     1000  ;      return     -1  ;   }   // returns decimal value of roman numeral   int     romanToDecimal  (  string  &     s  )     {      int     res     =     0  ;         for     (  int     i     =     0  ;     i      <     s  .  length  ();     i  ++  )     {          // get value of current symbol      int     s1     =     value  (  s  [  i  ]);      // Compare with the next symbol if it exists      if     (  i     +     1      <     s  .  length  ())     {      int     s2     =     value  (  s  [  i     +     1  ]);      // if current value is greater or equal       // add it to result      if     (  s1     >=     s2  )     {      res     +=     s1  ;      }      else     {      // else add the difference and skip       // next symbol      res     +=     (  s2     -     s1  );      i  ++  ;      }      }      else     {      res     +=     s1  ;      }      }      return     res  ;   }   int     main  ()     {      string     s     =     'IX'  ;      cout      < <     romanToDecimal  (  s  )      < <     endl  ;      return     0  ;   }   
Java
   class   GfG     {      // this function returns value of a Roman symbol      static     int     value  (  char     r  )     {      if     (  r     ==     'I'  )      return     1  ;      if     (  r     ==     'V'  )      return     5  ;      if     (  r     ==     'X'  )      return     10  ;      if     (  r     ==     'L'  )      return     50  ;      if     (  r     ==     'C'  )      return     100  ;      if     (  r     ==     'D'  )      return     500  ;      if     (  r     ==     'M'  )      return     1000  ;      return     -  1  ;      }      // returns decimal value of roman numeral      static     int     romanToDecimal  (  String     s  )     {      int     res     =     0  ;         for     (  int     i     =     0  ;     i      <     s  .  length  ();     i  ++  )     {          //get value of current symbol      int     s1     =     value  (  s  .  charAt  (  i  ));      // compare with the next symbol if it exists      if     (  i     +     1      <     s  .  length  ())     {      int     s2     =     value  (  s  .  charAt  (  i     +     1  ));      // If current value is greater or equal       // add it to result      if     (  s1     >=     s2  )     {      res     +=     s1  ;      }      else     {      // else add the difference and skip       // next symbol      res     +=     (  s2     -     s1  );      i  ++  ;      }      }      else     {      res     +=     s1  ;      }      }      return     res  ;      }      public     static     void     main  (  String  []     args  )     {      String     s     =     'IX'  ;      System  .  out  .  println  (  romanToDecimal  (  s  ));      }   }   
Python
   # this function returns value of a Roman symbol   def   value  (  r  ):   if   r   ==   'I'  :   return   1   if   r   ==   'V'  :   return   5   if   r   ==   'X'  :   return   10   if   r   ==   'L'  :   return   50   if   r   ==   'C'  :   return   100   if   r   ==   'D'  :   return   500   if   r   ==   'M'  :   return   1000   return   -  1   # returns decimal value of roman numeral   def   romanToDecimal  (  s  ):   res   =   0   i   =   0   while   i    <   len  (  s  ):   # get value of current symbol   s1   =   value  (  s  [  i  ])   # compare with the next symbol if it exists   if   i   +   1    <   len  (  s  ):   s2   =   value  (  s  [  i   +   1  ])   # if current value is greater or equal    # add it to result   if   s1   >=   s2  :   res   +=   s1   else  :   # else add the difference and    # skip next symbol   res   +=   (  s2   -   s1  )   i   +=   1   else  :   res   +=   s1   i   +=   1   return   res   if   __name__   ==   '__main__'  :   s   =   'IX'   print  (  romanToDecimal  (  s  ))   
C#
   using     System  ;   class     GfG     {          // this function returns value of a Roman symbol      static     int     value  (  char     r  )     {      if     (  r     ==     'I'  )      return     1  ;      if     (  r     ==     'V'  )      return     5  ;      if     (  r     ==     'X'  )      return     10  ;      if     (  r     ==     'L'  )      return     50  ;      if     (  r     ==     'C'  )      return     100  ;      if     (  r     ==     'D'  )      return     500  ;      if     (  r     ==     'M'  )      return     1000  ;      return     -  1  ;      }      // returns decimal value of roman numeral      static     int     romanToDecimal  (  string     s  )     {      int     res     =     0  ;         for     (  int     i     =     0  ;     i      <     s  .  Length  ;     i  ++  )     {          // get value of current symbol      int     s1     =     value  (  s  [  i  ]);      // compare with the next symbol if it exists      if     (  i     +     1      <     s  .  Length  )     {      int     s2     =     value  (  s  [  i     +     1  ]);      // if current value is greater or equal       // add it to result      if     (  s1     >=     s2  )     {      res     +=     s1  ;      }      else     {      // else add the difference and skip      // next symbol      res     +=     (  s2     -     s1  );      i  ++  ;      }      }      else     {      res     +=     s1  ;      }      }      return     res  ;      }      static     void     Main  ()     {      string     s     =     'IX'  ;      Console  .  WriteLine  (  romanToDecimal  (  s  ));      }   }   
JavaScript
   // this function returns value of a Roman symbol   function     value  (  r  )     {      if     (  r     ===     'I'  )         return     1  ;      if     (  r     ===     'V'  )         return     5  ;      if     (  r     ===     'X'  )         return     10  ;      if     (  r     ===     'L'  )         return     50  ;      if     (  r     ===     'C'  )         return     100  ;      if     (  r     ===     'D'  )         return     500  ;      if     (  r     ===     'M'  )         return     1000  ;      return     -  1  ;   }   // returns decimal value of roman numeral   function     romanToDecimal  (  s  )     {      let     res     =     0  ;         for     (  let     i     =     0  ;     i      <     s  .  length  ;     i  ++  )     {          // get value of current symbol      let     s1     =     value  (  s  [  i  ]);      // compare with the next symbol if it exists      if     (  i     +     1      <     s  .  length  )     {      let     s2     =     value  (  s  [  i     +     1  ]);      // if current value is greater or equal       // add it to result      if     (  s1     >=     s2  )     {      res     +=     s1  ;      }      else     {      // else add the difference and       // skip next symbol      res     +=     (  s2     -     s1  );      i  ++  ;      }      }      else     {      res     +=     s1  ;      }      }      return     res  ;   }   // Driver Code   let     s     =     'IX'  ;      console  .  log  (  romanToDecimal  (  s  ));   

Izlaz
9  

[Očekivani pristup 2] Korištenje raspršivanja - O (n) vrijeme i O (1)

Za pohranjivanje vrijednosti rimskih simbola možemo koristiti hash kartu ili rječnik. I da bismo riješili problem, moramo ponoviti kroz niz i za svaki simbol provjerite je li trenutna vrijednost manja od sljedeće vrijednosti. Ako je tako oduzme trenutnu vrijednost od sljedeće vrijednosti i dodajte rezultat ukupnom. Inače dodajte trenutnu vrijednost u ukupnu vrijednost.

C++
   #include          #include         using     namespace     std  ;   int     romanToDecimal  (  string     &  s  )     {      unordered_map   <  char       int  >     romanMap     =     {{  'I'       1  }         {  'V'       5  }         {  'X'       10  }         {  'L'       50  }      {  'C'       100  }         {  'D'       500  }         {  'M'       1000  }};      int     res     =     0  ;      for     (  int     i     =     0  ;     i      <     s  .  length  ();     i  ++  )     {      // if the current value is less than the next value       // subtract current from next and add to res      if     (  i     +     1      <     s  .  length  ()     &&     romanMap  [  s  [  i  ]]      <     romanMap  [  s  [  i     +     1  ]])     {      res     +=     romanMap  [  s  [  i     +     1  ]]     -     romanMap  [  s  [  i  ]];      // skip the next symbol      i  ++  ;      }      else     {      // otherwise add the current value to res      res     +=     romanMap  [  s  [  i  ]];      }      }      return     res  ;   }   int     main  ()     {      string     s     =     'IX'  ;      cout      < <     romanToDecimal  (  s  )      < <     endl  ;      return     0  ;   }   
Java
   import     java.util.HashMap  ;   class   GfG     {      static     int     romanToDecimal  (  String     s  )     {      HashMap   <  Character       Integer  >     romanMap     =     new     HashMap   <>  ();      romanMap  .  put  (  'I'       1  );      romanMap  .  put  (  'V'       5  );      romanMap  .  put  (  'X'       10  );      romanMap  .  put  (  'L'       50  );      romanMap  .  put  (  'C'       100  );      romanMap  .  put  (  'D'       500  );      romanMap  .  put  (  'M'       1000  );      int     res     =     0  ;      for     (  int     i     =     0  ;     i      <     s  .  length  ();     i  ++  )     {      // if the current value is less than the next value      // subtract current from next and add to res      if     (  i     +     1      <     s  .  length  ()     &&     romanMap  .  get  (  s  .  charAt  (  i  ))      <         romanMap  .  get  (  s  .  charAt  (  i     +     1  )))     {      res     +=     romanMap  .  get  (  s  .  charAt  (  i     +     1  ))     -         romanMap  .  get  (  s  .  charAt  (  i  ));      // skip the next symbol      i  ++  ;      }      else     {      // otherwise add the current value to res      res     +=     romanMap  .  get  (  s  .  charAt  (  i  ));      }      }      return     res  ;      }      public     static     void     main  (  String  []     args  )     {      String     s     =     'IX'  ;      System  .  out  .  println  (  romanToDecimal  (  s  ));      }   }   
Python
   def   romanToDecimal  (  s  ):   romanMap   =   {  'I'  :   1     'V'  :   5     'X'  :   10     'L'  :   50     'C'  :   100     'D'  :   500     'M'  :   1000  }   res   =   0   i   =   0   while   i    <   len  (  s  ):   # if the current value is less than the next value    # subtract current from next and add to res   if   i   +   1    <   len  (  s  )   and   romanMap  [  s  [  i  ]]    <   romanMap  [  s  [  i   +   1  ]]:   res   +=   romanMap  [  s  [  i   +   1  ]]   -   romanMap  [  s  [  i  ]]   # skip the next symbol   i   +=   1   else  :   # otherwise add the current value to res   res   +=   romanMap  [  s  [  i  ]]   i   +=   1   return   res   if   __name__   ==   '__main__'  :   s   =   'IX'   print  (  romanToDecimal  (  s  ))   
C#
   using     System  ;   using     System.Collections.Generic  ;   class     GfG     {      static     int     romanToDecimal  (  string     s  )     {          // create a map to store the Roman numeral values      Dictionary   <  char       int  >     romanMap     =         new     Dictionary   <  char       int  >     {      {  'I'       1  }     {  'V'       5  }     {  'X'       10  }     {  'L'       50  }      {  'C'       100  }     {  'D'       500  }     {  'M'       1000  }      };      int     res     =     0  ;      for     (  int     i     =     0  ;     i      <     s  .  Length  ;     i  ++  )     {          // if the current value is less than the next value       // subtract current from next and add to res      if     (  i     +     1      <     s  .  Length     &&     romanMap  [  s  [  i  ]]      <     romanMap  [  s  [  i     +     1  ]])     {      res     +=     romanMap  [  s  [  i     +     1  ]]     -     romanMap  [  s  [  i  ]];      // skip the next symbol      i  ++  ;      }      else     {          // otherwise add the current value to res      res     +=     romanMap  [  s  [  i  ]];      }      }      return     res  ;      }      static     void     Main  ()     {      string     s     =     'IX'  ;      Console  .  WriteLine  (  romanToDecimal  (  s  ));      }   }   
JavaScript
   function     romanToDecimal  (  s  )     {          // create a map to store the Roman numeral values      const     romanMap     =     {      'I'  :     1       'V'  :     5       'X'  :     10       'L'  :     50        'C'  :     100       'D'  :     500       'M'  :     1000      };      let     res     =     0  ;      for     (  let     i     =     0  ;     i      <     s  .  length  ;     i  ++  )     {      // if the current value is less than the next value       // subtract current from next and add to res      if     (  i     +     1      <     s  .  length     &&     romanMap  [  s  [  i  ]]      <     romanMap  [  s  [  i     +     1  ]])     {      res     +=     romanMap  [  s  [  i     +     1  ]]     -     romanMap  [  s  [  i  ]];      // skip the next symbol      i  ++  ;      }      else     {      // otherwise add the current value to res      res     +=     romanMap  [  s  [  i  ]];      }      }      return     res  ;   }   // Driver Code   let     s     =     'IX'  ;   console  .  log  (  romanToDecimal  (  s  ));   

Izlaz
9