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 写做 X 双 VII,即为 XX + V + II。
    通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为 Ix。这个特殊的规则只适用于以下六种情况:

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

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

    示例 1:

    输入: "III"
    输出: 3

    示例 2:

    输入: "IV"
    输出: 4

    示例 3:

    输入: "IX"
    输出: 9

    示例 4:

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

    示例 5:

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

     方法一:暴力法

    思路

      1. 将String转为char数组

      2. 定义int变量num作为return的变量

      3. 干扰正常计数的情况只有IV、IX、XL、XC、CD、CM六种,所以我们遍历char数组,注意这次遍历从i = 0到i = ch.length - 1,因为要判断ch[i+1]

      4. 判断ch[i] 和 ch[i+1]的情况,假如满足IV或者IX,就把num-2,因为IV=4,比起正常的I + V要减少2,依次类推,碰到XL、XC需要num-20,碰到CD、CM需要num-200

      5. 再次遍历数组,这回就只需要判断字母是什么,把num加上对应的值,例如 ch[i] = C; num += 100;

    class Solution {
        public int romanToInt(String s) {
            //将String转为char数组
            char[] ch = s.toCharArray();
            //定义int遍历num作为return的变量
            int num = 0;
            //干扰正常计数的情况只有IV、IX、XL、XC、CD、CM 六种,所以我们遍历char数组,注意这次遍历从i到i=ch.length-1,因为要判断ch[i+1]
            for (int i = 0; i < ch.length - 1; i++) {
                //判断ch[i]和ch[i+1]的情况,假如满足IV或者IX,就把num-2,因为IV=4,比起正常的I + V 要减少2,一次类推,碰到XL,XC需要num-20,碰到CD、CM需要num-200
                if(ch[i] == 'I' && (ch[i + 1] == 'V' || ch[i + 1] == 'X'))
                    num -= 2;
                if(ch[i] == 'X' && (ch[i + 1] == 'L' || ch[i + 1] == 'C'))
                    num -= 20;
                if(ch[i] == 'C' && (ch[i + 1] == 'D' || ch[i + 1] == 'M'))
                    num -= 200;
            }
            //再次遍历数组,这回只需要判断字母是什么,num加上对应的值,例如ch[i]=M; num+=1000;
            for (int i = 0; i < ch.length; i++) {
                switch (ch[i]) {
                    case 'M': {
                        num += 1000;
                        continue;
                    }
                    case 'D': {
                        num += 500;
                        continue;
                    }
                    case 'C': {
                        num += 100;
                        continue;
                    }
                    case 'L': {
                        num += 50;
                        continue;
                    }
                    case 'X': {
                        num += 10;
                        continue;
                    }
                    case 'V': {
                        num += 5;
                        continue;
                    }
                    default: {
                        num += 1;
                        continue;
                    }
                }
            }
            return num;
        }

    方法二:hash表

    思路

    • 首先将所有的组合可能性列出并添加到哈希表中
    • 然后对字符串进行遍历,由于组合只有两种,一种是 1 个字符,一种是 2 个字符,其中 2 个字符优先于 1 个字符
    • 先判断两个字符的组合在哈希表中是否存在,存在则将值取出加到结果 ans 中,并向后移2个字符。不存在则将判断当前 1 个字符是否存在,存在则将值取出加到结果 ans 中,并向后移 1 个字符
    • 遍历结束返回结果 ans

    代码实现

    class Solution {
        public int romanToInt(String s) {
            //将所有的组合可能性列出并添加到哈希表中
            Map<String, Integer> map = new HashMap<>();
            map.put("I", 1);
            map.put("IV", 4);
            map.put("V", 5);
            map.put("IX", 9);
            map.put("X", 10);
            map.put("XL", 40);
            map.put("L", 50);
            map.put("XC", 90);
            map.put("C", 100);
            map.put("CD", 400);
            map.put("D", 500);
            map.put("CM", 900);
            map.put("M", 1000);
            //定义答案变量
            int ans = 0;
            for(int i = 0;i < s.length();) {
                //如果i+1小于字符串总长度并且字符串中当前第i到i+2这两个罗马字符是否在map里,如果不在则是一个罗马字符
                if(i + 1 < s.length() && map.containsKey(s.substring(i, i+2))) {
                    //把两个罗马字符加到ans答案里
                    ans += map.get(s.substring(i, i+2));
                    //找到两个罗马字符,i则后移两位
                    i += 2;
                } else {
                    //把一个罗马字符加到ans答案里
                    ans += map.get(s.substring(i, i+1));
                    //找到一个罗马字符,i则后移一位
                    i ++;
                }
            }
            return ans;
        }
    }

    知识扩展

    【知识卡片】哈希表存储的是由键(key)和值(value)组成的数据。例如,我们将每个人的性别作为数据进行存储,键为人名,值为对应的性别。

    • Python 中我们使用字典key:value}来初始化哈希表
    • 通过key查找value的时间复杂度为O(1)
    • 这题题解中的d就是一个字典,其中get(key,default)函数可以通过key从d中找出对应的值,如果key不存在则返回默认值 default
  • 相关阅读:
    HTB-靶机-Charon
    第一篇Active Directory疑难解答概述(1)
    Outlook Web App 客户端超时设置
    【Troubleshooting Case】Exchange Server 组件状态应用排错?
    【Troubleshooting Case】Unable to delete Exchange database?
    Exchange Server 2007的即将生命周期,您的计划是?
    "the hypervisor is not running" 故障
    Exchange 2016 体系结构
    USB PE
    10 months then free? 10个月,然后自由
  • 原文地址:https://www.cnblogs.com/xiaozhongfeixiang/p/12037378.html
Copyright © 2011-2022 走看看