Като се има предвид низ, представляващ римска цифра, това е съответната целочислена стойност.
Римските цифри се образуват с помощта на следните символи: i = 1 v = 5 x = 10 l = 50 c = 100 d = 500 и m = 1000.
Числата обикновено се формират чрез комбиниране на тези символи отляво надясно Добавяне или изваждане на техните стойности въз основа на конкретни правила.
великденски яйца в android
Как работи преобразуването?
- Ако идва символ по -малка стойност, преди да извадим. Иначе добавяме.
- В IV I идва преди V и V има по -голяма стойност 5. Така че резултатът ни е 5 - 1 = 4.
- В VI V идва преди I и аз да имаме по -малка стойност 1. Така че резултатът ни е 5 + 1 = 6.
- В II имаме същите стойности, така че добавяме и получаваме 1 + 1 = 2
- В случай на повече от 2 знака, ние преминаваме отляво надясно и групираме само когато видим по -голяма стойностна стойност след по -малък стойностен символ. Например MXVII е 1000 + 10 + 5 + 1 + 1 = 1017., А xlvii е (50 - 10) + 5 + 1 + 1 = 47. Обърнете внимание, че L е по -голям и идва след X.
Примери:
Вход: s = 'ix'
Резултат: 9
Обяснение: Ix е римски символ, който представлява 10 - 1 = 9array.sort в javaВход: s = 'xl'
Резултат: 40
Обяснение: XL е римски символ, който представлява 50 - 10 = 40Вход: S = 'McMiv'
Резултат: 1904
Обяснение: M е 1000 cm е 1000 - 100 = 900, а IV е 4. Така че имаме общо като 1000 + 900 + 4 = 1904
Съдържание
uml диаграма java
- [Очакван подход 1] Използване на итеративно сравнение - O (n) време и O (1) пространство
- [Очакван подход 2] Използване на хеширане - O (n) време и O (1) пространство
[Очакван подход 1] Използване на итеративно сравнение - O (n) време и O (1) пространство
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));
Изход
9
[Очакван подход 2] Използване на хеширане - O (n) време и O (1) пространство
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));
Изход
9