Finden Sie bei einer gegebenen Zeichenfolge s, die eine römische Zahl darstellt, den entsprechenden ganzzahligen Wert.
Römische Zahlen werden mit den folgenden Symbolen gebildet: I = 1 V = 5 X = 10 L = 50 C = 100 D = 500 und M = 1000.
Zahlen werden normalerweise gebildet, indem diese Symbole von links nach rechts kombiniert und ihre Werte basierend auf bestimmten Regeln addiert oder subtrahiert werden.
Java hat als nächstes
Wie funktioniert die Konvertierung?
- Wenn ein kleineres Wertsymbol vorkommt, subtrahieren wir. Ansonsten ergänzen wir.
- In IV kommt I vor V und V hat einen größeren Wert 5. Unser Ergebnis ist also 5 - 1 = 4.
- In VI steht V vor I und I hat den kleineren Wert 1. Unser Ergebnis ist also 5 + 1 = 6.
- In II haben wir die gleichen Werte, also addieren wir und erhalten 1 + 1 = 2
- Bei mehr als 2 Zeichen blättern wir von links nach rechts und gruppieren nur dann, wenn wir ein Zeichen mit größerem Wert nach einem Zeichen mit kleinerem Wert sehen. Zum Beispiel ist MXVII 1000 + 10 + 5 + 1 + 1 = 1017. Und XLVII ist (50 - 10) + 5 + 1 + 1 = 47. Beachten Sie, dass L größer ist und nach X kommt.
Beispiele:
Eingang: s = 'IX'
Ausgabe: 9
Erläuterung: IX ist ein römisches Symbol, das 10 - 1 = 9 darstelltEingang: s = 'XL'
Ausgabe: 40
Erläuterung: XL ist ein römisches Symbol, das 50 – 10 = 40 darstelltJava ist nullEingang: s = 'MCMIV'
Ausgabe: 1904
Erläuterung: M ist 1000 CM ist 1000 - 100 = 900 und IV ist 4. Wir haben also insgesamt 1000 + 900 + 4 = 1904
Inhaltsverzeichnis
- [Erwarteter Ansatz 1] Verwendung eines iterativen Vergleichs – O(n)-Zeit und O(1)-Raum
- [Erwarteter Ansatz 2] Verwendung von Hashing – O(n) Zeit und O(1) Raum
[Erwarteter Ansatz 1] Verwendung eines iterativen Vergleichs – O(n)-Zeit und O(1)-Raum
C++Die Idee bei der Umwandlung einer römischen Zahl in eine ganze Zahl besteht darin, dass wir die Zeichenfolge von links nach rechts durchlaufen müssen. Vergleichen Sie jedes Symbol mit dem nächsten Symbol (falls vorhanden). Wenn das aktuelle Symbol größer oder gleich dem nächsten Symbol ist, addieren Sie seinen Wert zum Ergebnis. Andernfalls subtrahieren Sie seinen Wert vom Wert des nächsten Symbols, addieren das Ergebnis zur Gesamtsumme und überspringen das nächste Symbol.
#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));
Ausgabe
9
[Erwarteter Ansatz 2] Verwendung von Hashing – O(n) Zeit und O(1) Raum
C++Wir können eine Hash-Map oder ein Wörterbuch verwenden, um die Werte römischer Symbole zu speichern. Und um das Problem zu lösen, müssen wir die Zeichenfolge durchlaufen und für jedes Symbol prüfen, ob der aktuelle Wert kleiner als der nächste Wert ist. Wenn ja, subtrahieren Sie den aktuellen Wert vom nächsten Wert und addieren Sie das Ergebnis zur Gesamtsumme. Andernfalls addieren Sie den aktuellen Wert zur Gesamtsumme.
Enum tostring Java
#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));
Ausgabe
9