Leetcode: если дана римская цифра, преобразуйте ее в целое число. Гарантируется, что ввод находится в диапазоне от 1 до 3999.
Чтобы решить эту проблему, мне нужно было сначала понять, как читать римские цифры и переводить их рукой.
Https://www.mathsisfun.com/roman-numerals.html содержит четкое и лаконичное объяснение римских цифр. Для решения этой проблемы вам нужно по-настоящему понять только эту диаграмму:
Правила вычисления римских ›› Integer
- (ДОБАВЛЕНИЕ) Значение каждого символа (обычно) складывается слева направо:
- MMLVII (1000 + 1000 + 50 + 5 + 1 + 1) = 2057
2. (ВЫЧИТАНИЕ) Когда перед большим числом ставится меньшее число.
- XIX (10 + (10-1)) = 19
Простым решением было создать цикл for для каждого символа в строке, содержащей римские цифры, и преобразовать их в их целочисленные значения. Произведите расчеты до итоговой суммы в соответствии с двумя приведенными выше правилами сложения и вычитания.
int romanToInt(string s) { int total = 0; for(int i = 0; i < s.length(); i++){ //1.The letters are arranged from left to right in descending order of value to form a number if(integer_of(s[i]) <= interger_of[s[i]]) { total += integer_of(s[i]); } //2.when you see a lower value in front of a higher value (subtract) else { total += integer_of(s[i]); } } return total; }
Лучший способ сохранить таблицу для преобразования римских цифр в соответствующие им целочисленные значения - использовать хэш-карту:
map<char, int> m = {{'I', 1}, {'V', 5},{'X', 10},{'L', 50},{'C', 100},{'D', 500},{'M', 1000}};
Собираем все вместе:
int romanToInt(string s) { map<char, int> m = {{'I', 1}, {'V', 5},{'X', 10},{'L', 50}, {'C', 100},{'D', 500},{'M', 1000}}; int total = 0; for(int i = 0; i < s.length(); i++){ if(m[s[i+1]] <= m[s[i]]) total += m[s[i]]; else total -= m[s[i]]; } return total; }
Easy-Peasy Lemon Squeezy!
Как всегда, я приветствую отзывы и обсуждения.