zoukankan      html  css  js  c++  java
  • LeetCode_13 罗马数字转整数

    题目描述

    罗马数字包含以下七种字符: 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 。
    

    通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,特殊的规则只适用于以下六种情况:

    • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
    • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
    • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

    给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

    示例

    输入: "III"
    输出: 3

    输入: "IV"
    输出: 4

    输入: "IX"
    输出: 9

    输入: "LVIII"
    输出: 58
    解释: L = 50, V= 5, III = 3.

    输入: "MCMXCIV"
    输出: 1994
    解释: M = 1000, CM = 900, XC = 90, IV = 4.

    知识点

    • 罗马数字
    • 字典
    • 哈希表
    • String字符串

    哈希表/switch

    存储的是由键(key)和值(value)组 成的数据。

    string.at(i)

    可以得到字符串的第i位

    string.size(string)

    可以得到字符串大小

    解法

    思路 左小减,左大加

    规则:
    罗马数字由 I,V,X,L,C,D,M 构成;
    当小值在大值的左边,则减小值,如 IV=5-1=4;
    当小值在大值的右边,则加小值,如 VI=5+1=6;
    由上可知,右值永远为正,因此最后一位必然为正。
    一言蔽之,把一个小值放在大值的左边,就是做减法,否则为加法。
    
    

    算法流程

    • 1.假设输入都是合法的罗马字
    • 2.转换函数:罗马数字I,V,X,L,C,D,M分别对应数字
    • 3.如果第二个罗马数字<第一个罗马数字(调用转换函数),就相加
    • 4.如果第二个罗马数字>第一个罗马数字(调用转换函数),就相减
    • 5.返回得到的数字结果

    代码

    //C++
    #include <iostream>
    #include<string>
    using namespace std;
    class Solution {
    public:
        int romanToInt(string s) {//输入的是字符串
            int sum = 0;//sum记录当前右值
            int prenum = getValue(s.at(0));//字符串的第一个字符转换成数字,用prenum记录左值
            for (int i = 1; i < s.size(); ++i) {//string size()返回字符串大小,每次循环处理prenum
                int postnum = getValue(s.at(i));//用postnum记录右值
                if (postnum > prenum) //如果小值在左边prenum,sum-左值
                    sum -= prenum;
              
                else//如果小值在右边,sum+左值
                    sum += prenum;
                prenum = postnum;//比较完相邻两个字符的大小后,把sum赋值给prenum,作为下一次比较的左值
            }
            sum += prenum;//最后一次跳出循环的时候,把最后一个postnum赋值给了prenum,所以最后sum还要加上prenum
            return sum;
    
        }
    
    //函数需要设置为public???
        int getValue(char ch) {//对每一个字符进行转换成数字
            switch (ch) {
            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 main() {
        Solution solution;
        string c1 = "IXX";
        string c2 = "IV";
        string c3 = "LVIII";
        string c4 = "MCMXCIV";
        cout << solution.romanToInt(c1) << endl;
        cout << solution.romanToInt(c2) << endl;
        cout << solution.romanToInt(c3) << endl;
        cout << solution.romanToInt(c4) << endl;
    }
    
    
    
    
  • 相关阅读:
    MongoDB 查询$关键字 $in $or $all
    MongoDB limit 选取 skip跳过 sort排序 方法
    POJ 1700
    POJ 1666
    POJ 1701
    POJ 1674
    POJ 1664
    POJ 1665
    POJ 1658
    POJ 1656
  • 原文地址:https://www.cnblogs.com/zhuomoyixia/p/12403608.html
Copyright © 2011-2022 走看看