Romalı'dan Tamsayıya Dönüştürme

Romalı'dan Tamsayıya Dönüştürme
GfG Practice'de deneyin

Bir Romen rakamını temsil eden bir dize verildiğinde, buna karşılık gelen tamsayı değerini bulun.
Romen rakamları şu semboller kullanılarak oluşturulur: I = 1 V = 5 X = 10 L = 50 C = 100 D = 500 ve M = 1000.
Sayılar genellikle bu sembollerin soldan sağa birleştirilmesiyle, belirli kurallara göre değerlerinin eklenmesi veya çıkarılmasıyla oluşturulur.

Dönüşüm nasıl çalışır?

  • Çıkarma işleminden önce daha küçük bir değer sembolü gelirse. Aksi halde ekliyoruz.
  • IV'te I, V'den önce gelir ve V'nin değeri 5'ten büyüktür. Dolayısıyla sonucumuz 5 - 1 = 4 olur.
  • VI'da V, I'den önce gelir ve I'in değeri 1'den küçüktür. Yani sonucumuz 5 + 1 = 6 olur.
  • II'de aynı değerlere sahip olduğumuz için toplayıp 1 + 1 = 2 elde ederiz.
  • 2'den fazla karakter olması durumunda soldan sağa doğru hareket ederiz ve yalnızca daha küçük değerli bir karakterden sonra daha büyük değerli bir karakter gördüğümüzde gruplandırırız. Örneğin MXVII 1000 + 10 + 5 + 1 + 1 = 1017'dir. XLVII ise (50 - 10) + 5 + 1 + 1 = 47'dir. L'nin daha büyük olduğunu ve X'ten sonra geldiğini unutmayın.

Örnekler:

Giriş: s = 'IX'
Çıkış: 9
Açıklama: IX, 10 - 1 = 9'u temsil eden bir Roma sembolüdür

Giriş: s = 'XL'
Çıkış: 40
Açıklama: XL, 50 - 10 = 40'ı temsil eden bir Roma sembolüdür

Giriş: s = 'MCMIV'
Çıkış: 1904
Açıklama: M, 1000 CM, 1000 - 100 = 900 ve IV, 4'tür. Yani toplamımız 1000 + 900 + 4 = 1904 olur.

İçerik Tablosu

[Beklenen Yaklaşım 1] Yinelemeli Karşılaştırmanın Kullanılması - O(n) zamanı ve O(1) uzayı

Romen rakamını bir tam sayıya dönüştürme fikri, diziyi soldan sağa doğru hareket ettirmemiz gerektiğidir. Her sembol için onu bir sonraki sembolle (varsa) karşılaştırın. Geçerli sembol bir sonraki sembolden büyük veya ona eşitse değerini sonuca ekleyin. Aksi takdirde değerini bir sonraki sembolün değerinden çıkarın ve sonucu toplama ekleyin ve bir sonraki sembolü atlayın.

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  ));   

Çıkış
9  

[Beklenen Yaklaşım 2] Karma Kullanımı - O(n) zamanı ve O(1) alanı

Roma sembollerinin değerlerini saklamak için karma harita veya sözlük kullanabiliriz. Sorunu çözmek için dizeyi tekrarlamamız ve her sembol için mevcut değerin bir sonraki değerden küçük olup olmadığını kontrol etmemiz gerekir. Eğer öyleyse, mevcut değeri bir sonraki değerden çıkarın ve sonucu toplama ekleyin. Aksi takdirde mevcut değeri toplama ekleyin.

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  ));   

Çıkış
9