【LeetCode_字符串_逻辑分析】13. 罗马数字转整数

news2024/11/19 13:39:27

目录

  • 考察点
  • 第一次: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;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HTML5期末作业】用HTML+CSS一个兰州交通大学官网网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

百度 Android 直播秒开体验优化

作者 | 任雪龙 导读 网络直播功能作为一项互联网基本能力已经越来越重要&#xff0c;手机中的直播功能也越来越完善&#xff0c;电商直播、新闻直播、娱乐直播等多种直播类型为用户提供了丰富的直播内容。随着直播的普及&#xff0c;为用户提供极速、流畅的直播观看体验也越来越…

外汇天眼:什么是外汇动量交易?新手指南

1. 什么是动量交易&#xff1f; 我们需要了解的第一件事是动量到底是什么。势头是字面意义上的趋势强度。动量交易策略涉及仅在强劲的价格趋势方向开仓&#xff0c;利用持续的价格变动&#xff0c;并在趋势逆转之前退出。 动量交易者通常不会担心趋势在哪里结束和开始&#x…

计算机毕业设计ssm+vue基本微信小程序的校园通知小程序系统 uniapp 小程序

项目介绍 随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具。在高校,各种管理系统层出不穷,为校园通知管理开发必要的系统,能够有效的提升管理效率。一直以来,校园通知一直没有进行系统化的管理,学生无法准确掌握高校通知状态,…

35岁以上的那些测试员何去何从?

人人都说IT行业&#xff1a;35岁就是一道坎&#xff01;跨不过就是一道中年危机&#xff0c;跨过了就成养老保险。那么35岁之后&#xff0c;软件测试从业者都去哪了&#xff1f;能力不行&#xff0c;中年危机很多刚入行的测试的新人&#xff0c;毫无经验&#xff0c;但是远远却…

数图互通高校房产管理——移动端微信小程序

数图互通房产管理系统在这方面做得比较全面&#xff1b; 随着移动智能手机功能的应用日益成熟&#xff0c;学校要求使用移动端微信小程序端进行房产清查、房产数据查询功能。可以利用手机等移动设备来现场查看房屋实际使用情况和清查房屋数据&#xff0c;也可以通过移动终端查…

日记:“实战深度学习”-第1天

机缘 说起来有点偶然&#xff0c;在某书APP中随手详细介绍了学习深度学习相关的历程&#xff0c;断断续续应该发了几百个笔记&#xff0c;持续时间有大概&#xff11;.5年左右&#xff0c;然后某一天清华出版社的赵编辑突然找到我&#xff0c;问我能否分享一下学习的过程&#…

Spring源码深度解析:十二、后处理器 BeanPostProcessor

一、前言 文章目录&#xff1a;Spring源码深度解析&#xff1a;文章目录 二、BeanPostProcessor 所谓的BeanPostProcessor翻译过来就是Bean后处理器。 1. 什么是 BeanPostProcessor BeanPostProcessor是 Spring提供给我们的一个非常重要的扩展接口&#xff0c;并且Spring内…

【C++11多线程】线程同步之线程通信:condition_variable

文章目录1.condition_variable2.notify_one()和notify_all()3.wait()3.1 没有第二个参数&#xff1a;while wait()3.2 有第二个参数&#xff1a;wait() lambda需要注意的是&#xff0c;条件变量condition_variable要和互斥锁mutex搭配起来使用。 1.condition_variable cond…

Windows远程连接Redis(Linux)

Windows远程连接Redis&#xff08;Linux&#xff09; 文章目录Windows远程连接Redis&#xff08;Linux&#xff09;1、写在前面2、配置redis.conf3、启动Redis3.1 开启redis服务3.2 启动客户端3.3 Redis命令3.4 查看Redis密码4、关闭Redis5、Java操作Redis1、写在前面 Windows…

安科瑞ARTU100系列模块化远程控制终端单元 开关量输入输出采集模块

安科瑞 王晶淼/刘芳 1.概述 ARTU系列远程终端单元是高性能配电智能化元件&#xff0c;应用于智能配电、工业自动化等领域。ARTU100系列远程终端单元提供开关量输入、开关量输出、模拟量输入、模拟量输出&#xff0c;能够将采集到的信号通过RS485串口、RJ45以太网接口、2G、Lo…

进制+异或

一.调用API String sInteger.toString(十进制&#xff0c;转为0-35进制)&#xff1b; //R进制的字符串转为10进制数 int aInteger.parseInt(s,R); //把R进制的字符串封装成大数类 BigInteger bnew BigInteger(s,R); 二.求R进制下的数位和 2992这个数十进制和为22&#xff0c;…

【计算机视觉】图像分割中FCN、DeepLab、SegNet、U-Net、Mask R-CNN等算法的讲解(图文解释 超详细)

觉得有帮助请点赞关注收藏~~~ 一、FCN分割算法 全卷积神经网络目标分割算法能够端到端的得到每个像素的目标分类结果&#xff0c;与传统的卷积神经网络只能输入固定大小图像和在网络的末端使用几个全连接层得到固定长度的特征向量不同&#xff0c;全卷积神经网络能够接受任意大…

HBase的数据模型和存储原理

HBase的数据模型 HBase中表的逻辑结构 Name Space&#xff08;命名空间&#xff09; 类似于关系型数据库的 DatabBase 概念&#xff0c;每个命名空间下有多个表。HBase有两个自带的命名空间&#xff0c;分别是 hbase 和 default&#xff0c;hbase 中存放的是 HBase 内置的表&a…

向 Excel 和 PowerPoint 添加可编辑地图的指南

本指南规定: 如何将 shapefile 转换为 svg 文件(如果后者不存在) 如何使用 Excel 重命名 svg 文件中的对象以使对象具有正确的地理名称,以及如何将这些添加为 PowerPoint 中的可编辑地图 这样做的目的是为那些没有或不知道该软件的人提供 QGIS 制图的替代方案。通过提供某个…

如何在 Linux 的 shell 里针对特定用户/组来限制某些命令的使用

0-前言 最近&#xff0c;业务侧有个需求&#xff0c;需要禁止特定用户访问linux特定的命令&#xff0c;如禁止用户A使用rm命令。 我们知道&#xff0c;在linux系统中&#xff0c;一切皆文件。 那么&#xff0c;这个问题也可以泛化为&#xff1a; 如何在linux里限制特定用户…

视频理解论文串讲(上)【论文精读】

文章目录1. DeepVedio【CNN 首次 for 视频理解】2. Two-Stream【双流网络】针对上面不同方向&#xff0c;有不同的代表工作LSTM late fusion 方向【Beyond-short-snippets】Early fusion方向【Convolutional fusion】长视频 【TSN temporal segment 分段的思想&#xff0c;good…

5分钟搞定Linux top命令的基本用法

在linux终端中&#xff0c;输入top, 按下Enter&#xff0c;立即进入top界面 如果你操作正确&#xff0c;应该会看到了下面这样的界面。 此情此景&#xff0c;怎么样是不是看懵逼了 不要慌&#xff0c;坐下来耐心听我逼逼赖赖你就会明白这一堆内容是干嘛的 下面介绍每一项分别是…

2022.12.8 半导体器件物理

作业 用迁移电流来推导出公式 电流是I&#xff0c;J是电流密度&#xff0c;W就是横截面 T是这个薄膜的厚度&#xff08;我们最后可以消除掉&#xff09; X就是空间位置&#xff0c;0就是在电极的一端 为什么要减去 因为只有大于阈值电压&#xff0c;才会有水流通过&#xff…

如此简单的时间复杂度计算方法:大O渐进法,你确定不进来康康

对于时间复杂度&#xff0c;空间复杂度&#xff0c;想必这个是大家在学习数据结构的初级阶段就会第一步认识的吧&#xff01;&#xff01;但是&#xff0c;对于复杂度的计算&#xff0c;涉及到了大O渐进法&#xff0c;这个方法是一个笼统的概念&#xff0c;所求得的结果&#x…