leetcode笔记:Roman to Integer

一.题目描述

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

二.题目分析

还是先总结一下罗马数字,这是网上找到的一些解释:

罗马数字是最古老的数字表示方式,比阿拉伯数组早2000多年,起源于罗马…

罗马数字有如下符号:

基本字符: I V X L C D M

对应阿拉伯数字 :1 5 10 50 100 500 1000

计数规则: 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4正常使用时,连续的数字重复不得超过三次在一个数的上面画横线,表示这个数扩大1000倍。

题目思路,从输入字符串的第一个字符开始(从前向后遍历罗马数字),假设有一个临时变量k,结果存放在result变量中,算法执行过程中分为以下三种情况:

如果当前字符所对应的数字比前一位字符小,那么就可以先将临时变量的值k加到结果result中,然后开始下一段记录。比如VI = 5 + 1,此时当前为为‘I‘,小于前一位‘V‘,又k = 5,当前位对应的数值curr = 1,则结果更新为:result = k + curr,然后更新临时变量k = curr

如果当前字符所对应的数字和上一个字符一样,那么临时变量k加上这个字符。比如XXX = 30,在此过程中k = 10 + 10 + 10

如果当前字符所对应的数字比前一位字符大,意味着这一段的值应该是当前这个值减去前面累加的临时变量k中的值,比如IIV = 5 – 2

三.示例代码

class Solution
{
public:
int getRomanValue(char c) {
        switch (c) {
            case ‘I‘: return 1;
            case ‘V‘: return 5;
            case ‘X‘: return 10;
            case ‘L‘: return 50;
            case ‘C‘: return 100;
            case ‘D‘: return 500;
            case ‘M‘: return 1000;
            default: return 0;
        }
    }

    int romanToInt(string s)
    {
        if (s.size() < 1) return -1;
        int result = 0;
        int temp = getRomanValue(s[0]);
        int k = temp;
        for (size_t i = 1; i < s.size(); i++)
        {
            int curr = getRomanValue(s[i]);
            if (temp > curr)
            {
                result += k;
                k = curr;
            }
            else if (temp == curr)
                k = k + curr;
            else
                k = curr - k;
            temp = curr;
        }
        result += k;
        return result;
    }
};

四.小结

网上有更简便的思路:

class Solution {
public:
    int romanToInt(string s) {
        int map[26];
        map[‘I‘ - ‘A‘] = 1; map[‘V‘ - ‘A‘] = 5; map[‘X‘ - ‘A‘] = 10; map[‘L‘ - ‘A‘] = 50;
        map[‘C‘ - ‘A‘] = 100; map[‘D‘ - ‘A‘] = 500; map[‘M‘ - ‘A‘] = 1000;
        int res = 0, n = s.size();
        s.push_back(s[n - 1]);
        for (int i = 0; i < n; i++)
        {
            if (map[s[i] - ‘A‘] >= map[s[i + 1] - ‘A‘])
                res += map[s[i] - ‘A‘];
            else res -= map[s[i] - ‘A‘];
        }
        return res;
    }
};

对应的题目:Integer to Roman。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-18 03:56:03

leetcode笔记:Roman to Integer的相关文章

LeetCode 013 Roman to Integer

[题目] Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. [题意] 把罗马数转换为整数 [思路] 罗马数字中只使用如下七个基值字母:M,D,C,L,X,V,I,分别用来表示1000.500.100.50.10.5.1. 大体思路是每个罗马字母对应的值相加即可, 但需要处理900, 400, 90, 40, 9, 4这几个特殊值(左

[LeetCode OJ] Roman to Integer

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 下面是百度得到的关于罗马数的解释: 我的代码: 1 class Solution { 2 public: 3 int romanToInt(string s) { 4 map<char,int> conversion; 5 conversion.insert(make_pair('

[LeetCode][Python]Roman to Integer

# -*- coding: utf8 -*-'''__author__ = '[email protected]'https://oj.leetcode.com/problems/roman-to-integer/Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.===Comments by Daba

[LeetCode][JavaScript]Roman to Integer

Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. https://leetcode.com/problems/roman-to-integer/ 罗马数字转阿拉伯数字. 从后往前扫,如果当前的数大于之前的数,加上这个数,反之减去当前的数. 1 /** 2 * @param {string} s 3

leetCode 13. Roman to Integer 字符串

13. Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 补充:罗马数字 罗马数字共有七个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000).按照下面的规则可以表示任意正整数. 重复数次:一个罗马数字重复几次,就表示这个数的几倍. 右加左减:在一个较大的罗马数

【leetcode】Roman to Integer

Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 罗马数字有如下符号: 基本字符 I V X L C D M 阿拉伯数字 1 5 10 50 100 500 1000 计数规则: 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3 小的数字在大的数字右边,所表示的数等于这些数字

Leetcode#13. Roman to Integer(罗马数字转整数)

题目描述 罗马数字包含以下七种字符:I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 写做 XII ,即为 X + II . 27 写做 XXVII, 即为 XX + V + II . 通常情况下,罗马数字中小的数字在大的数字的右边.但也存在特例,例如 4 不写做 IIII,而是 IV.数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数

Leetcode 13. Roman to Integer(水)

13. Roman to Integer Easy Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000 For example, two is written as II in Roman numeral, just two one's added together. Twelve i

LeetCode 13. Roman to Integer

https://leetcode.com/problems/roman-to-integer/#/description Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 字符串简单题,要搞清楚转换规则.如果当前字母比前一个大,则相减,比如IV = 5 - 1:否则就相加,比如VI = 5 + 1,II = 1 + 1. 罗马数字_

[LeetCode] 013. Roman to Integer (Easy) (C++/Java/Python)

索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 013.Roman_to_Integer (Easy) 链接: 题目:https://oj.leetcode.com/problems/roman-to-integer/ 代码(github):https://github.com/illuz/leetcode 题意: 把罗马数转为十进制. 分析: 跟 012. I