热门标签 | 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略慢一点。
在这里插入图片描述


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
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社区 版权所有