力扣面试150题打卡

题目链接:13. 罗马数字转整数 - 力扣(LeetCode)

一 题目背景

做出来这道题目主要是了解罗马数字的构成以及罗马数字转化成10进制数字怎么转换

1.1罗马数字的构成:罗马数字由 7 个基本字符组:

I(1), V(5), X(10), L(50), C(100), D(500), M(1000)。

1.2 他们的组合也有一些小规律

(1)一般情况:

大数字在左边,小数字在右边,数值为各数字之和,下面举例说明

VI = 5+1 = 6; XI = 10 + 1 = 11;

(2)特殊情况:

小数字在大数字左边的时候,表示用大数字减去小数字,下面举例说明:

IV = 5 - 1 = 4; IX = 10 - 1 = 9; XL = 50 - 10 = 40;等等......

二写程序

知道他们的构成以及计算方式,就可以直接写程序了,核心思想是利用一个倒序遍历字符串s,如果大于,就将数字加上去,更新一下右边的最大值,反之直接减去较小的数字即可

java 复制代码
class Solution {
    public int romanToInt(String s) {
        //创建一个哈希表将数据存入
        Map<Character,Integer> map = new HashMap<>();
        map.put('M', 1000);
        map.put('D', 500);
        map.put('C', 100);
        map.put('L', 50);
        map.put('X', 10);
        map.put('V', 5);
        map.put('I', 1);
        //定义一个返回值
        int ans = 0;
        //定义一个值,代表右边的最大数字
        int cur = 1;
        //倒序遍历字符串s
        for(int i=s.length()-1;i>=0;i--){
            int val = map.get(s.charAt(i));
            //情况一:遍历该处的数字大于cur,直接加,加完,将右边最大值更新
            //情况二:遍历该处的数字小于cur,直接减
            if(val>=cur){
                ans+=val;
                cur = val;

            }else{
                ans-=val;
            }
        }
        return ans;
    }
}
相关推荐
倒头就睡的小比特20 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!21 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
晨米酱1 天前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
彧azz1 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法