【LeetCode_字符串_逻辑分析】13. 罗马数字转整数
创始人
2024-04-19 08:18:13
0

目录

  • 考察点
  • 第一次:2022年12月8日15:24:16
    • 解题思路
      • 代码展示
    • 优秀的解题思路
      • 1. 总结规律
      • 2. 字符串替换

题目描述

13. 罗马数字转整数

考察点

逻辑分析能力

第一次:2022年12月8日15:24:16

解题思路

分析能力有待提高

代码展示

class Solution {public int romanToInt(String s) {int result = 0;int special = 0;// 当前下标int i = 0;// 下标的下一位置int j = 0;// 当前的下标还在字符串里面while (i < s.length()) {// 求出下标的下一位置j = i + 1;// 如果下标的下一个位置 到达 字符串的末尾了if (j == s.length()){// 当前的值 + 当前字符对应的值result += charToNum(s.charAt(i));// 跳出循环break;}// 判断当前下标的字符是否能够与下一个字符 组成特殊情况StringBuilder stringBuilder = new StringBuilder();special = specialCondition(stringBuilder.append(s.charAt(i)).append(s.charAt(j)).toString());// 如果能够组成特殊情况if (special != 0){// 当前的值 + 特殊情况的值result += special;// 下标跳一位i = i + 2;}// 不能够组成特殊情况else {// 当前的值 + 当前字符对应的值result += charToNum(s.charAt(i));// 下标移到下一位i ++;}}return result;}/*** 特殊的规则适用的六种情况** @param s 字符串* @return int 结果*/private int specialCondition(String s) {switch (s) {case "IV": return 4;case "IX": return 9;case "XL": return 40;case "XC": return 90;case "CD": return  400;case "CM": return 900;default: return 0;}}/*** 字符转数字** @param i 字符* @return int 数字*/private int charToNum(char i) {switch (i) {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;}}
}

测试用例

    public static void main(String[] args) {Solution solution = new Solution();System.out.println(solution.romanToInt("MCMXCIV"));}

优秀的解题思路

1. 总结规律

作者:donespeak

链接:https://leetcode.cn/problems/roman-to-integer/solution/yong-shi-9993nei-cun-9873jian-dan-jie-fa-by-donesp/

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

  1. 罗马数字由 I,V,X,L,C,D,M 构成;
  2. 当小值在大值的左边,则减小值,如 IV=5-1=4;
  3. 当小值在大值的右边,则加小值,如 VI=5+1=6;
  4. 由上可知,右值永远为正,因此最后一位必然为正。

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

在这里插入图片描述

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

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

2. 字符串替换

在这个解题思路链接的评论区中看到的。

妙蛙种子给妙趣角开门,妙到家了

class Solution {public int romanToInt(String s) {s = s.replace("IV","a");s = s.replace("IX","b");s = s.replace("XL","c");s = s.replace("XC","d");s = s.replace("CD","e");s = s.replace("CM","f");int res = 0;for (int i = 0; i < s.length(); i++) {res += getValue(s.charAt(i));}return res;}public int getValue(char c) {switch(c) {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;case 'a': return 4;case 'b': return 9;case 'c': return 40;case 'd': return 90;case 'e': return 400;case 'f': return 900;}return 0;}
}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...