[Java·算法·简单] LeetCode 13. 罗马数字转整数 详细解读

简介: [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 + II27 写做  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

输入: s = "III"

输出: 3


示例2

输入: s = "IV"

输出: 4


示例3

输入: s = "LVIII"

输出: 58

解释: L = 50, V= 5, III = 3


示例4

输入: s = "IX"

输出: 9


示例5

输入: s = "MCMXCIV"

输出: 1994

解释: M = 1000, CM = 900, XC = 90, IV = 4.


提示

 

👉️ 力扣原文

 

class Solution {
    public int romanToInt(String s) {
        int sum=0;
        int preNum = getValue(s.charAt(0));
        for(int i=1;i<s.length();i++){
            int num=getValue(s.charAt(i));
            if(preNum < num){
                sum -= preNum;
            }else{
                sum += preNum;
            }
            preNum = num;
        }
        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;
        }
    }
}


详细解读

按照题目的描述,可以总结如下规则:


罗马数字由 I,V,X,L,C,D,M 构成;

当小值在大值的左边,则减小值,如 IV=5-1=4;

当小值在大值的右边,则加小值,如 VI=5+1=6;

由上可知,右值永远为正,因此最后一位必然为正。

一言蔽之,把一个小值放在大值的左边,就是做减法,否则为加法。


在代码实现上,可以往后看多一位,对比当前位与后一位的大小关系,从而确定当前位是加还是减法。当没有下一位时,做加法即可。


也可保留当前位的值,当遍历到下一位的时,对比保留值与遍历位的大小关系,再确定保留值为加还是减。最后一位做加法即可。


这段代码实现了将罗马数字转换为整数的功能。主要思路是遍历输入的罗马数字字符串,对于每一个字符,通过 getValue() 方法获取其对应的整数值,并根据罗马数字规则进行累加或累减。


具体来说:


  1. 初始化变量 sum 为 0,preNum 为第一个字符对应的整数值。
  2. 从第二个字符开始遍历字符串。
  3. 对于当前字符,获取其整数值 num。
  4. 如果 preNum 小于 num,则表示当前字符代表的整数值应该减去 preNum;否则,将 preNum 加到 sum 中。
  5. 更新 preNum 为当前字符对应的整数值。
  6. 遍历完所有字符后,将最后一个字符对应的整数值加到 sum 中。
  7. 返回 sum。


这个算法利用了罗马数字的规则,例如,当小值字符在大值字符的左边时,应该做减法操作;当小值字符在大值字符的右边时,应该做加法操作。

相关文章
|
1月前
|
存储 算法 JavaScript
怎么刷算法,leetcode上有哪些经典题目
怎么刷算法,leetcode上有哪些经典题目
16 0
|
16天前
|
算法 Java C语言
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
|
3天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
8天前
|
算法
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
18 3
|
8天前
|
算法
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
14 3
|
8天前
|
算法
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
30 1
|
10天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
18天前
|
算法 安全 Java
java代码 实现AES_CMAC 算法测试
该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出&quot;验证成功&quot;,否则输出&quot;验证失败&quot;。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。
|
28天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
33 0
|
1月前
|
算法 搜索推荐 Java
利用java编写的项目设备调配系统代码示例(内含5种设备调配的算法)
利用java编写的项目设备调配系统代码示例(内含5种设备调配的算法)
15 1