logo

Rimsko v celo število pretvorbo

Poskusite na praksi GFG ' title=

Glede na niz, ki predstavlja rimsko številčno ugotovitev, da je ustrezna celo število.
Rimske številke se tvorijo z naslednjimi simboli: i = 1 V = 5 x = 10 l = 50 c = 100 d = 500 in m = 1000.
Številke se običajno oblikujejo tako, da te simbole združujejo od leve proti desni, ki dodajajo ali odštejejo njihove vrednosti na podlagi določenih pravil.

niz v jsonobject

Kako deluje pretvorba?

  • Če simbol manjše vrednosti pride, preden odštejemo. Sicer dodamo.
  • V IV prihaja, preden ima V in V večjo vrednost 5. Torej je naš rezultat 5 - 1 = 4.
  • V vi v prihaja pred jaz in imam manjšo vrednost 1. Torej je naš rezultat 5 + 1 = 6.
  • V II imamo iste vrednosti, zato dodamo in dobimo 1 + 1 = 2
  • V primeru več kot dveh znakov prečkamo od leve proti desni in skupini le, ko vidimo večjo vrednost znaka po manjši vrednosti. Na primer mxvii je 1000 + 10 + 5 + 1 + 1 = 1017. In xlvii je (50 - 10) + 5 + 1 + 1 = 47. Upoštevajte, da je L večji in pride po X.

Primeri:



Vnos: s = 'ix'
Izhod: 9
Pojasnilo: Ix je rimski simbol, ki predstavlja 10 - 1 = 9

številka abecede

Vnos: s = 'xl'
Izhod: 40
Pojasnilo: XL je rimski simbol, ki predstavlja 50 - 10 = 40

Vnos: S = 'McMiv'
Izhod: 1904
Pojasnilo: M je 1000 cm je 1000 - 100 = 900, IV pa 4. Torej imamo skupno kot 1000 + 900 + 4 = 1904

Tabela vsebine

java je instanceof

[Pričakovani pristop 1] Uporaba iterativne primerjave - O (n) čas in O (1)

Ideja za pretvorbo rimske številke v celo število je, da moramo vrvico prehoditi od leve proti desni. Za vsak simbol ga primerjajte z naslednjim simbolom (če obstaja). Če je trenutni simbol večji ali enak naslednjemu simbolu, dodajte njegovo vrednost v rezultat. V nasprotnem primeru odštejte njegovo vrednost od vrednosti naslednjega simbola in dodajte rezultat v skupno in preskočite naslednji 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)); 

Izhod
9 

[Pričakovani pristop 2] z uporabo hashing - o (n) časa in o (1) prostora

Za shranjevanje vrednosti rimskih simbolov lahko uporabimo zemljevid ali slovar. In za reševanje problema, ki jo moramo ponoviti skozi niz in za vsak simbol preverite, ali je trenutna vrednost manjša od naslednje vrednosti. Če je tako odšteti trenutno vrednost od naslednje vrednosti in dodajte rezultat v skupno vrednost. V nasprotnem primeru dodajte trenutno vrednost v skupno vrednost.

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

Izhod
9