问题简介

 这个问题其实与整数转化为罗马数字相当。

编程思路

转换函数写全一些(包括400、900、40、90等)

Map<String, Integer> transfer = new HashMap<>();transfer.put("I", 1);transfer.put("IV", 4);transfer.put("V", 5);transfer.put("IX", 9);transfer.put("X", 10);transfer.put("XL", 40);transfer.put("L", 50);transfer.put("XC", 90);transfer.put("C", 100);transfer.put("CD", 400);transfer.put("D", 500);transfer.put("CM", 900);transfer.put("M", 1000);

转换函数不包括400、900等

 这题懂了就非常简单。首先建立一个HashMap来映射符号和值,然后对字符串从左到右来,如果当前字符代表的值不小于其右边,就加上该值;否则就减去该值。以此类推到最左边的数,最终得到的结果即是答案

Map<String, Integer> transfer = new HashMap<>();transfer.put("I", 1);transfer.put("V", 5);transfer.put("X", 10);transfer.put("L", 50);transfer.put("C", 100);transfer.put("D", 500);transfer.put("M", 1000);

参考别人实现

与开始数字进行比较

代码实现

AC第一种解法

    public int romanToInt(String s) {Map<String, Integer> transfer = new HashMap<>();transfer.put("I", 1);transfer.put("IV", 4);transfer.put("V", 5);transfer.put("IX", 9);transfer.put("X", 10);transfer.put("XL", 40);transfer.put("L", 50);transfer.put("XC", 90);transfer.put("C", 100);transfer.put("CD", 400);transfer.put("D", 500);transfer.put("CM", 900);transfer.put("M", 1000);int result = 0;for (int i = 0; i < s.length(); ) {String s1 = s.substring(i, i + 1);String s2 = "";if (i == s.length() - 1) {s2 = s1;} else {s2 = s.substring(i, i + 2);}if (transfer.containsKey(s2)) {result += transfer.get(s2);i += 2;} else {result += transfer.get(s1);i++;}}return result;}

AC第二种解法

III 3
IV 4
V 5
IX 9
LVIII 58
MCMXCIV 1994

第一个版本-有问题

    public int romanToInt(String s) {Map<String, Integer> transfer = new HashMap<>();transfer.put("I", 1);transfer.put("IV", 4);transfer.put("V", 5);transfer.put("IX", 9);transfer.put("X", 10);transfer.put("XL", 40);transfer.put("L", 50);transfer.put("XC", 90);transfer.put("C", 100);transfer.put("CD", 400);transfer.put("D", 500);transfer.put("CM", 900);transfer.put("M", 1000);int result = 0;for (int i = 0; i < s.length(); i += 2) {String s1 = s.substring(i, i + 1);String s2;if (i < s.length() - 1) {s2 = s.substring(i + 1, i + 2);} else {s2 = s1;}Integer left = transfer.get(s1);Integer right = transfer.get(s2);if (left > right) {result += left;result += right;} else if (left < right) {result += right;result -= left;} else {// 此时left = right// 这个位置,语义不好理解,不好理解的代码,就不是好代码if (i < s.length() - 1) {result += left;result += right;} else {result += left;}}}return result;}

 这个程序是有问题的,这是因为对于MCMXCIV而言,虽然M > C 但是不能直接处理两个,当前把left和right等价而看是有问题的。

AC版本

 一定要理解的是在处理的过程中,如果第一个字符对应的数字小于第二个字符的数字,则语义是确定的,但是如果第一个对应的数字>=第二字符对应的数字,能够确定的是左边的数字。

​ 可以通过例子

MCMXCIV 1994

虽然M对应的数字1000大于C对应的数字100,无法把C作为独立的整体进行使用,因为不确定C作为100还是C后面有M,此时CM作为整体而存在。

    public int romanToInt(String s) {Map<String, Integer> transfer = new HashMap<>();transfer.put("I", 1);transfer.put("V", 5);transfer.put("X", 10);transfer.put("L", 50);transfer.put("C", 100);transfer.put("D", 500);transfer.put("M", 1000);int result = 0;for (int i = 0; i < s.length();) {String s1 = s.substring(i, i + 1);String s2;if (i < s.length() - 1) {s2 = s.substring(i + 1, i + 2);} else {// 这个位置使用s2 = s1也是比较巧妙的。因为下面transfer.get(s2)不会抛出异常了。s2 = s1;}Integer left = transfer.get(s1);Integer right = transfer.get(s2);if (left >= right) {result += left;i++;} else if (left < right) {result += right;result -= left;i += 2;}}return result;}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNrNdmHp-1644409854520)(https://s2.loli.net/2022/02/09/VQXZEkhNPYImOue.png)]

总结

 今天发生了两件事情,一个是我爸醉酒了,晚上我非常担心,有个成语叫做自作自受,我也没有办法代其受过,就很难受,晚上跟他睡在一起,醉态百出,以后我一定不要喝醉,无论什么场合,能喝多少喝多少。不让家人担心。另外就是熬夜,昨晚1点才睡,第二天感觉气色很差,还非常的难受,今年工作的时候,争取每天10点睡觉。养足精神,固本培元。

 家庭真的不是吵架的地方,而是秀恩爱的地方。希望读者在自己的家里充当好爱的角色,不要生气,更不要怨天尤人,有怨气的人是无法获得幸福和开怀的笑的,会非常不幸。

 在编程时突然想到,在typora中使用在写代码的时候,添加代码块默认添加java的代码块,最终通过阅读文章通过ahk实现了。

力扣网-罗马数字转整数相关推荐

  1. 力扣13 罗马数字转整数逻辑详解

    力扣 13 .罗马数字转整数逻辑详解 题目详情 逻辑分析 代码实现 题目详情 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 1 ...

  2. 【力扣网练习题】整数反转

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321  示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出 ...

  3. 力扣 13.罗马数字转整数

    文章目录 题目 AC代码 总结 题目 题目在这 这是一道简单等级的题目. AC代码 这是我的思路,就是按照题中给的意思,一行代码一行代码地撸出来的,显得很笨. class Solution {publ ...

  4. 力扣网---贪心算法(JAVA实现)---中等(一)

    分类记录力扣网刷题的笔记.也算对自己的督促. 目录 55,跳跃游戏 134,加油站 376,摆动序列 406,根据身高重建队列 452,用最少数量的箭引爆气球 649,Dota参议院 861.翻转矩阵 ...

  5. 刷爆力扣之罗马数字转整数

    刷爆力扣之罗马数字转整数 HELLO,各位看官大大好,我是阿呆

  6. python整数反转_敲代码学Python:力扣简单算法之整数反转

    学习重点:整数逆序算法 力扣(LeetCode)原题​leetcode-cn.com ''' 功能:整数反转 来源:https://leetcode-cn.com/explore/featured/c ...

  7. 【力扣网练习题】罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符          数值 I             1 V             5 X             10 L ...

  8. 【力扣网练习题】移除元素

    给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  9. 【力扣网练习题】删除排序数组中的重复项

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...

最新文章

  1. lnmp下安装PECL HTTP 扩展
  2. srping atomikos 的jta 事物管理
  3. 云serverlinux又一次挂载指定文件夹(非扩充)
  4. 常见的天气现象有哪些
  5. android视频播放器api,03.视频播放器Api说明
  6. java 对象给对象赋值为空_java中,只声明一个对象不赋值,与声明一个对象并赋为 null 的区别...
  7. Apache+php+mysql在windows下的安装与配置图解之apache篇
  8. php连接池 php–cp
  9. Process p = new Process();
  10. 重磅炸弹之英译世界名著137部
  11. 计算机专业c类大学,【计算机应用技术】专业排名A+、A、B+、B、C类院校分数线...
  12. db2 linux 64位下载,Redhat6.2 64位 安装DB2V10.5
  13. python数据库模糊查询_python中的mysql数据库like模糊查询
  14. python的turtle库画苹果
  15. 物联网服务器搭建记录,心得
  16. 微信H5活动抽奖单页面模板源码
  17. 平面设计的概念是什么,如何理解平面设计的概念
  18. 苹果,忘了发家的根本…
  19. java程序设计课程培训心得体会_Java课程学习感想
  20. Matlab实现分组检测

热门文章

  1. RabbitMQ教程_2 RabbitMQ 安装
  2. PCTA考试经验分享
  3. cad图片边框怎么去掉
  4. 获取文件夹中所有文件清单
  5. SOLIDWORKS: Visualize SOLIDWORKS:可视化 Lynda课程中文字幕
  6. 安装activemq或者tomcat等启动时报错
  7. Window.clearTimeout() 方法取消由 setTimeout() 方法设置的 timeout
  8. 什么事LLVM和Clang?Clang与GCC有什么区别?Clang如何使用?
  9. Moss 自定义Featur
  10. 神经网络之反向传播算法(均方根反向传播算法RMSProp)