Med tanke på en sträng som representerar en romersk siffra finner det motsvarande heltal.
Romerska siffror bildas med följande symboler: i = 1 V = 5 x = 10 L = 50 C = 100 D = 500 och M = 1000.
Siffror bildas vanligtvis genom att kombinera dessa symboler från vänster till höger att lägga till eller subtrahera deras värden baserat på specifika regler.
terminal kali linux
Hur fungerar konverteringen?
- Om en mindre värdesymbol kommer innan vi subtraherar. Annars lägger vi till.
- I IV kommer jag innan V och V har ett större värde 5. Så vårt resultat är 5 - 1 = 4.
- I vi kommer innan jag och jag har ett mindre värde 1. Så vårt resultat är 5 + 1 = 6.
- I II har vi samma värden så vi lägger till och får 1 + 1 = 2
- Vid mer än två tecken går vi från vänster till höger och grupperar endast när vi ser ett större värdetecken efter en mindre värdetecken. Till exempel är MXVII 1000 + 10 + 5 + 1 + 1 = 1017. och XLVII är (50 - 10) + 5 + 1 + 1 = 47. Observera att L är större och kommer efter X.
Exempel:
Input: s = 'ix'
Produktion: 9
Förklaring: Ix är en romersk symbol som representerar 10 - 1 = 9Input: s = 'xl'
Produktion: 40
Förklaring: XL är en romersk symbol som representerar 50 - 10 = 40Input: s = 'mcmiv'
Produktion: 1904
Förklaring: M är 1000 cm är 1000 - 100 = 900 och iv är 4. Så vi har totalt 1000 + 900 + 4 = 1904vad är min datorskärmstorlek
Innehållsbord
- [Förväntat tillvägagångssätt 1] Med hjälp av iterativ jämförelse - O (n) Tid och O (1) Rymdutrymme
- [Förväntat tillvägagångssätt 2] Med hjälp av hashing - o (n) tid och o (1) utrymme
[Förväntat tillvägagångssätt 1] Med hjälp av iterativ jämförelse - O (n) Tid och O (1) Rymdutrymme
C++Idén att konvertera en romersk siffra till ett heltal är att vi måste korsa strängen från vänster till höger. För varje symbol jämför den med nästa symbol (om den finns). Om den nuvarande symbolen är större än eller lika med nästa symbol, lägg till dess värde till resultatet. Annar annars dröja sitt värde från nästa symbols värde och lägg till resultatet till det totala och hoppa över nästa symbol.
char och int java
#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));
Produktion
9
[Förväntat tillvägagångssätt 2] Med hjälp av hashing - o (n) tid och o (1) utrymme
C++Vi kan använda en hashkarta eller ordbok för att lagra värdena på romerska symboler. Och för att lösa problemet har vi att iterera genom strängen och för varje symbol, kontrollera om det aktuella värdet är mindre än nästa värde. I så fall subtrahera det aktuella värdet från nästa värde och lägg till resultatet till det totala. Annars lägg till det aktuella värdet till det totala.
#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));
Produktion
9