热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【LeetCodeJava】13.罗马数字转整数(简单)

目录1.题目描述2.解题思路3.代码实现3.1向后多看一位(switch)3.2记住前一位数(hashmap)3.3记住前一

目录

    • 1. 题目描述
    • 2. 解题思路
    • 3. 代码实现
      • 3.1 向后多看一位(switch)
      • 3.2 记住前一位数(hashmap)
      • 3.3 记住前一位数(switch)
      • 3.4 替换输入字符串(switch)
      • 3.5 对比


1. 题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 解题思路

这道题目的第一个思路就是先把输入的字符串转换成字符数组,对字符数组进行遍历,利用switch进行对应的罗马字符判断,然后判断特殊情况的时候向后看多一位。这种方法简单直接,应该大部分都能想得出来。但是运行了一下发现,嗯…问题是能解决的,但是效率不够高

经过一番思考发现,每一次判断特殊情况都需要向后看多一位,影响效率,转变一下方式,我们可以每读一个字符就记下来,每次判断时利用上一次记下来的值进行比较,那就可以省去向后看多一位这个动作,一定程度上其实是属于空间换时间的操作(多存一个变量,少查一次),这种方法可以通过switchhashmap实现。

做完以上两种尝试过后结果还不错,看了一眼题解能有什么奇招,发现还可以进行字符串替换,即把特殊情况的字符串都替换成自定义字符,方便后续进行运算,这个方法有点意思,但在效率上会稍微逊色

3. 代码实现


3.1 向后多看一位(switch)

public int romanToInt(String s) {char[] chars &#61; s.toCharArray();int sum &#61; 0;int length &#61; chars.length;for (int i &#61; 0; i < length; i&#43;&#43;) {switch (chars[i]) {case &#39;I&#39;:try {if (chars[i &#43; 1] &#61;&#61; &#39;V&#39; || chars[i &#43; 1] &#61;&#61; &#39;X&#39;) {sum &#61; sum - 1;} else {sum &#61; sum &#43; 1;}} catch (Exception e) {return sum &#43; 1;}break;case &#39;X&#39;:try {if (chars[i &#43; 1] &#61;&#61; &#39;L&#39; || chars[i &#43; 1] &#61;&#61; &#39;C&#39;) {sum &#61; sum - 10;} else {sum &#61; sum &#43; 10;}} catch (Exception e) {return sum &#43; 10;}break;case &#39;C&#39;:try {if (chars[i &#43; 1] &#61;&#61; &#39;D&#39; || chars[i &#43; 1] &#61;&#61; &#39;M&#39;) {sum &#61; sum - 100;} else {sum &#61; sum &#43; 100;}} catch (Exception e) {return sum &#43; 100;}break;case &#39;V&#39;:sum &#61; sum &#43; 5;break;case &#39;L&#39;:sum &#61; sum &#43; 50;break;case &#39;D&#39;:sum &#61; sum &#43; 500;break;case &#39;M&#39;:sum &#61; sum &#43; 1000;break;}}return sum;}

3.2 记住前一位数&#xff08;hashmap&#xff09;

public int romanToInt(String s) {int sum &#61; 0;char[] chars &#61; s.toCharArray();HashMap<Character, Integer> changeMap &#61; new HashMap<>();changeMap.put(&#39;I&#39;, 1);changeMap.put(&#39;V&#39;, 5);changeMap.put(&#39;X&#39;, 10);changeMap.put(&#39;L&#39;, 50);changeMap.put(&#39;C&#39;, 100);changeMap.put(&#39;D&#39;, 500);changeMap.put(&#39;M&#39;, 1000);int old &#61; 1001;for (char aChar : chars) {Integer integer &#61; changeMap.get(aChar);if (old < integer) {sum -&#61; 2 * old;}sum &#43;&#61; integer;old &#61; integer;}return sum;}

3.3 记住前一位数&#xff08;switch&#xff09;

public int romanToInt(String s) {int sum &#61; 0;char[] chars &#61; s.toCharArray();int old &#61; 1001;int integer &#61; 0;for (char aChar : chars) {switch (aChar) {case &#39;I&#39;:integer &#61; 1;break;case &#39;X&#39;:integer &#61; 10;break;case &#39;C&#39;:integer &#61; 100;break;case &#39;V&#39;:integer &#61; 5;break;case &#39;L&#39;:integer &#61; 50;break;case &#39;D&#39;:integer &#61; 500;break;case &#39;M&#39;:integer &#61; 1000;break;}if (old < integer) {sum -&#61; 2 * old;}sum &#43;&#61; integer;old &#61; integer;}return sum;}

我所尝试的四种算法当中这种算法是最优的结果&#xff1a;
在这里插入图片描述

3.4 替换输入字符串&#xff08;switch&#xff09;

public int romanToInt(String s) {int sum &#61; 0;s &#61; s.replace("IV", "a");s &#61; s.replace("IX", "b");s &#61; s.replace("XL", "c");s &#61; s.replace("XC", "d");s &#61; s.replace("CD", "e");s &#61; s.replace("CM", "f");char[] chars &#61; s.toCharArray();for (char aChar : chars) {switch (aChar) {case &#39;I&#39;:sum &#43;&#61; 1;break;case &#39;X&#39;:sum &#43;&#61; 10;break;case &#39;C&#39;:sum &#43;&#61; 100;break;case &#39;V&#39;:sum &#43;&#61; 5;break;case &#39;L&#39;:sum &#43;&#61; 50;break;case &#39;D&#39;:sum &#43;&#61; 500;break;case &#39;M&#39;:sum &#43;&#61; 1000;break;case &#39;a&#39;:sum &#43;&#61; 4;break;case &#39;b&#39;:sum &#43;&#61; 9;break;case &#39;c&#39;:sum &#43;&#61; 40;break;case &#39;d&#39;:sum &#43;&#61; 90;break;case &#39;e&#39;:sum &#43;&#61; 400;break;case &#39;f&#39;:sum &#43;&#61; 900;break;}}return sum;}

3.5 对比

显然&#xff0c;采用哈希表的代码看上去更加优雅&#xff0c;但需要占用额外的存储空间&#xff0c;并且比switch略慢一点。
在这里插入图片描述


推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
author-avatar
落墨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有