Leetcode每日一题——罗马数字转整数

本文介绍了一种使用字典和字符串操作将罗马数字转换为整数的算法,通过示例详细展示了如何处理特殊组合如IV和IX,适用于1到3999范围内的罗马数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

罗马数字包含以下七种字符: 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。这个特殊的规则只适用于以下六种情况:

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.

解题过程

看到题目的第一眼,肯定是考虑一个一个判断,对照数值一个一个加上去就好了,但这次我想尝试一下使用字典。

字典

Java中使用Map接口实现字典键对值的概念,一般用这个语句,Map<Object1, Object2 > mapName = new HashMap<Object1, Object2>()创建 map。

Map常用方法

void clear():删除该Map对象中所有的key-value对。也就是清理该集合;

boolean containsKey(Object key):查询Map中是否包含指定的key;

boolean containsValue(Object value):查询Map中是否包含至少一个value;

Set entrySet():返回Map所包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map内部类);

Object get(Object key):返回指定key所对应的value,若此Map中不包含该key,返回null;

boolean isEmpty():判断Map集合是否为空;

Set keySet():返回该Map中所有key所组成的Set集合;

Object put(Object key,Object value):添加一个key-value对,若Map中已有与key相等的key-value对,则新的key-value对覆盖原来的key-value对;

void putAll(Map m):将m中的key-value赋值到调用该方法的Map对象中;

Object remove(Object key):删除指定key所对应的key-value对,返回本删除key所关联的value,若key不存在,返回null;

int size():返回该Map里面key-value对的个数;

Collection values():返回Map里所有value组成的Collection。

String类的substring()方法
截取字符串,在java语言中的用法

1、 public String substring(int beginIndex)

返回一个新字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。

参数:beginIndex - 开始处的索引(包括),

返回:指定的子字符串,

异常:如果 beginIndex 为负或大于此 String 对象的长度,则抛出IndexOutOfBoundsException

例 :“unhappy”.substring(2) returns"happy"

“mybaby”.substring(3) returns"aby"

2、public String substring(int beginIndex, int endIndex)

返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始, endIndex:到指定的 endIndex-1处结束。

参数:beginIndex - 开始处的索引(包括),endindex 结尾处索引(不包括)。
返回:指定的子字符串。
抛出:如果 beginIndex 为负,或length大于字符串长度,则抛出IndexOutOfBoundsException
例:“hamburger”.substring(3,8) returns “burge”
  “smiles”.substring(0,5) returns “smile”

代码

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 sum = 0;
        for(int i = 0; i < s.length();){
        
            if(i < (s.length()-1) && map.containsKey(s.substring(i, i+2))){
                sum += map.get(s.substring(i, i+2));
                 i += 2;
            }
        
            else{
               sum += map.get(s.substring(i, i+1));
                i++;
           }
        }
           return sum;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值