阅读 201

LeetCode13. 罗马数字转整数 详解

LeetCode13. 罗马数字转整数 详解

LeetCode13. 罗马数字转整数

题目描述

/**
     * 罗马数字包含以下七种字符: 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 得到的数值 4 。
     * 同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
     *
     * 给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

     */

思路分析

  1. 根据罗马字符串转整数,首先要知道罗马字符所对应的整数大小,因此考虑使用switch将每个罗马字符对应的整数返回,也可以考虑使用哈希表存储罗马字符和对应的整数

  2. 观察罗马字符串转整数的规则,即如果小的罗马字符在大的罗马字符去前边,就要减去小的罗马字符,如果大的罗马字符在小的罗马字符之前,就加上这个小的罗马字符

  3. 定义变量保存所有罗马字符计算的结果并返回

  4. 详解见源码

源码及详解

//思路分析
    //1. 因为是罗马数字转整数,因此要先编写一个方法,根据罗马字符获取到整数的大小
    //2. 由要求很容易发现罗马数字转整数的规律,即为如果一个小字符在大字符的前边,那么做减法
    //    否则做加法
    //3. 遍历这个包含罗马字符的字符串,依次将拿到的字符相加减
    //4. 最后返回计算的结果

    public int romanToInt(String s) {        //数据校验
        if (s == null || s.length() == 0){            return 0;
        }        //定义一个变量保存字符串的第一个字符所对应的整数大小
        int preNum = getValueByRoman(s.charAt(0));        //定义一个变量sum保存计算的和
        int sum = 0;        //遍历这个字符串的所有字符并计算
        for (int i = 1; i < s.length(); i++) {            //定义临时变量保存当前此遍历拿到的罗马字符对应的数字大小
            int temp = getValueByRoman(s.charAt(i));            //判断这个数和前一个数字的大小
            //如果这个数字大于前变的数字,执行减的操作
            if (temp > preNum){
                sum -= preNum;            //如果这个数字小于或等于前边的数字,执行加的操作
            }else {
                sum += preNum;
            }            //计算完一次之后重置preNum的值,即preNum向后移动一位
            preNum = temp;
        }        //循环结束后preNum指向最后一个字符对应的数字,但是循环已经结束,perNum还没有加入
        sum += preNum;        return sum;
    }    //编写方法根据罗马字符拿到对应的整数,可以考虑使用switch来完成,也可以使用散列表
    public int getValueByRoman(char c){        //定义变量保存返回的结果
        int res = 0;        switch (c){            case 'I':
                res = 1;                break;            case 'V':
                res = 5;                break;            case 'X':
                res = 10;                break;            case 'L':
                res = 50;                break;            case 'C':
                res = 100;                break;            case 'D':
                res = 500;                break;            case 'M':
                res = 1000;                break;
        }        return res;
    }

来源https://www.cnblogs.com/mx-info/p/14747204.html

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐