罗马数字转整数:探究古代数字编码的奥秘

news2024/11/18 5:49:41

在这里插入图片描述

本篇博客会讲解力扣中“13. 罗马数字转整数”这道题的解题思路。

大家先来审下题:题目链接。

题干如下:
在这里插入图片描述
有几个输出样例:
在这里插入图片描述
提示如下:
在这里插入图片描述
大家先思考一下,再来听我讲解。

本题的关键是:如何把罗马数字转换成整数?其实,题目中给的“罗马数字”本质上是一个字符串,这道题应该归类于字符串系列。字符串常规的遍历思路,大家一定要掌握。

既然是一个字符串,一定是要遍历的,大家可以使用while循环,这么写:

char* cp = s;
while (*cp)
{
	// ...
	++cp;
}

或者使用for循环,这么写:

for (char* cp = s; *cp; ++cp)
{
	// ...
}

我更加喜欢使用for循环,因为当中间的操作太长的时候,容易忘记++cp的迭代操作,而且读起来让我有种“不爽”的感觉。不过这不是重点,大家挑选自己喜欢的写法就行了。

当遍历到其中一个字符时,我们就可以根据“转换表”,转换成对应的数字了。大家可以使用switch case,或者写一堆if else,但是我更建议先把“转换规则”存到一个数组中,转换时直接到数组中找就行了。

这个数组应该如何实现呢?思路可以类似哈希表:下标代表要转换的罗马字符,数组存储的数据代表该罗马字符对应的数字。由于罗马字符都是大写字母,数组只需要26个元素就能够涵盖所有情况了。

再详细一点:罗马字符对应到数字的规则是:先把罗马字符对应的大写字母转换成下标,规则是pos=罗马字符-'A';再通过下标找到罗马字符对应的数字,即values[pos]。写成代码如下:

int romanToInt(char * s){
    // 使用数组存储罗马字符对应的数字
    static int values[26] = {0};
    values['I'-'A'] = 1;
    values['V'-'A'] = 5;
    values['X'-'A'] = 10;
    values['L'-'A'] = 50;
    values['C'-'A'] = 100;
    values['D'-'A'] = 500;
    values['M'-'A'] = 1000;

    // 遍历字符串
    for (char* cp = s; *cp; ++cp)
    {
		// ...
    }    
}

接下来,只需要把遍历到的罗马字符转换成对应的数字即可。这里需要科普以下转换规则。详细的规则题干中有说明,这里我简化一下:对于一个罗马数字,如果左大右小(大多数情况),规则是“相加”;如果左小右大,规则是“相减”。

所以,我们不仅需要遍历当前字符,还需要看该字符右边的字符,比较它们对应的数字的大小关系,来确定是“加上”还是“减去”该字符。这里需要注意:如果当前字符右边就是’\0’,就假设右边的字符对应的数字是0就行了,因为罗马字符对应的数字一定大于0,所以会归类于“左大右小”,此时的效果是“相加”,符合逻辑。

代码实现如下:

int romanToInt(char * s){
    // 使用数组存储罗马字符对应的数字
    static int values[26] = {0};
    values['I'-'A'] = 1;
    values['V'-'A'] = 5;
    values['X'-'A'] = 10;
    values['L'-'A'] = 50;
    values['C'-'A'] = 100;
    values['D'-'A'] = 500;
    values['M'-'A'] = 1000;

    // 遍历字符串
    int ret = 0;
    for (char* cp = s; *cp; ++cp)
    {
        // 计算该字符对应的数字
        int left = values[*cp-'A'];
        // 计算该字符右边的字符对应的数字
        int right = 0;
        if (*(cp+1))
            right = values[*(cp+1)-'A'];
        // 判断左右大小关系
        if (left >= right)
            ret += left;
        else
            ret -= left;
    }    

    return ret;
}

在这里插入图片描述
这就通过了。是不是很简单?

总结

  1. 字符串的遍历一定要掌握。
  2. 运用到了类似哈希表的思路,把数据先存储到数组中,需要的时候去数组中找就行了。

感谢大家的阅读!

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

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

相关文章

文末赠书3本 | 盼了一年的Core Java最新版卷Ⅱ,终于上市了

文章目录 盼了一年的Core Java最新版卷Ⅱ,终于上市了!Core Java基于Java 17全面升级Core Java最新版卷Ⅱ现已上市卷Ⅰ、卷Ⅱ有何不同?如何阅读《Java核心技术》从未远离工业界的Java大神带你学50位行业专家、技术媒体赞誉推荐如何选择版本文末…

Python基础入门(2)—— 什么是控制语句、列表、元组和序列?

文章目录 01 | 🚄控制语句02 | 🚅列表03 | 🚈元组04 | 🚝序列05 | 🚞习题 A bold attempt is half success. 勇敢的尝试是成功的一半。 前面学习了Python的基本原则、变量、字符串、运算符和数据类型等知识&#xff0c…

树形结构——堆的构建

在学习完我们的树形结构之后我们再来使用树形结构的思想构建一个堆。使用堆可以对我们的数据进行排序,并且堆排序的效率要远优于我们之前学习过的冒泡排序。下面我们来逐步实现堆这个数据结构。 在构建堆之前我们需要先介绍以下我们树形结构构建的两种形式&#xff…

掌握这些GitHub搜索技巧,你的开发效率将翻倍!

作为开发it行业一员,学习借鉴他人项目是很有必要的,所以我们一般都会从github或者 Gitee 上面去参考借鉴他人的项目来学习增加自己的项目经验 但是一般我还是在github上看项目比较多,毕竟人家实力项目量摆在那里 ,但是国内访问gi…

Spring Cloud的那些组件和功能,get到了吗

Spring Cloud 是 Spring 技术栈生态很重要的一部分,面向大型网站服务端的开发和架构设计,它以 Spring/SpringBoot 为基础,提供的一系列组件规范和具体实现。 一、概述 Spring Cloud 提供了用于更快速构建分布式系统的基础规范(例…

“深入”理解字节对齐

文章目录 前言思考查阅资料[Byte alignment and ordering](https://www.eventhelix.com/embedded/byte-alignment-and-ordering/)Byte Alignment RestrictionsWhy Restrict Byte Alignment?Compiler Byte PaddingUser Defined StructureActual Structure Definition Used By t…

使用SaleSmartly自动化流程的 5 个原因

想象一下,如果您可以采用智能数字解决方案来减轻团队和公司的手动和重复业务流程负担。它可以帮助您节省时间、提高公司的底线、消除冗余并增强数据管理。SaleSmartly(ss客服)就是这样。 通过利用自动化的力量,SaleSmartly&#x…

牛客网专项练习Pytnon分析库(一)

1.提取出a和b两个数组中的公共项,可以使用numpy库中的哪个函数(A)。 A.np.intersect1d(a,b) B.np.setdiff1d(a,b) C.np.where(a b) D.np.lexsort((a,b)) 解析: A选项,np.intersect1d用来获取数组a和数组b之间的公共项&…

MySQL遇到过死锁问题吗,你是如何解决的?

MySQL遇到过死锁问题吗,你是如何解决的? 问题解析 死锁,就是两个或者两个以上的线程在执行过程中,去争夺同一个共享资源导致互相等待的现象。 在没有外部干预的情况下,线程会一直处于阻塞状态,无法往下执行…

理解FPGA的基础知识——逻辑电路

FPGA (Field Programmable Gate Aray,现场可编程门阵列)是一种可通过重新编程来实现用户所需逻辑电路的半导体器件。为了便于大家理解FPGA的设计和结构,我们先来简要介绍一些逻辑电路的基础知识。 1.逻辑代数 逻辑代数中的变量称为逻辑变量,用大写字母表…

Arduino ESP32 ESP-Rainmaker点灯示例

Arduino ESP32 ESP-Rainmaker点灯示例 📌基于ESP-IDF工程相关篇《ESP32 ESP-Rainmaker 本地点灯控制Demo测试》🎈原项目地址:https://github.com/espressif/esp-rainmaker🔖本次所测试的项目示例工程:\esp-rainmaker—…

backtrader的cs功能介绍

cs框架的优点和缺点 优点和ts一样,就是速度非常快缺点有好几个:必须使用根据过去一定天数计算因子值,持有一定天数之后再平衡的模式;必须使用连续的数据,如果是期货期权等需要合成连续数据。资金不足的时候不会拒单。cs框架使用方法 设计理念 计算因子由用户进行计算,因…

用科技创造未来!流辰信息技术助您实现高效办公

随着社会的迅猛发展,科技的力量无处不见。它正在悄悄地改变整个社会,让人类变得进步和文明,让生活变得便捷和高效。在办公自动化强劲发展的今天,流辰信息技术让通信业、电网、汽车、物流等领域的企业实现了高效办公,数…

工具及方法 - 安装播放器pot player

官网下载: potplayer.daum.net 可能国内访问有问题,还有一个网站: Global Potplayer 或者为了纯净安全些,找下国外可下载网站: PotPlayer 230407 / 230504 Beta Free Download - VideoHelp 下载后安装即可&#xff…

红蜻蜓利用档案数字化管理,实现业务管理降本增效

在数字化大背景下,红蜻蜓积极拥抱数字化档案,全面优化档案管理成本,保证组织档案安全可信,助力企业业务高质量发展。 关于红蜻蜓 红蜻蜓,创始于1995年,是一家多品牌、多品类的时尚鞋履品牌运营商&#xf…

欧科云链OKLink:2023年4月安全事件盘点

一、基本信息 2023年4月安全事件共造约6000万美金的损失,与上个月相比,损失金额有所降落,但安全事件数量依旧不减。其中,Yearn Finance因参数配置错误,导致了1000多万美金的损失。同时,有一些已经出现过的…

【剧前爆米花--爪哇岛寻宝】TCP/IP协议以及在网络传输过程中的封装与分用

作者:困了电视剧 专栏:《JavaEE初阶》 文章分布:这是一篇关于网络初识的文章,在这篇文章中讲解了TCP/IP协议的主要内容和砸在网络传输过程中的封装和分用,希望对你有所帮助! 目录 TCP/IP五层模型 应用层…

渲染和不渲染的区别是什么?

随着计算机技术日新月异不断发展,电脑合成技术图像技术也日益成熟。在三维制作中,经常会提到一个词“渲染”,很多没有接触三维制作的朋友可能不是太清楚它究竟是什么,图像制作后,渲染和不渲染的区别是什么,…

【Admin后台管理】Geodjango后台显示地图并加载空间字段

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、djangoadmin二、geodjangoadmin三、报错处理 前言 在前面的博客中,我们已经介绍了Geodjango的环境搭建和数据库操作&…

网易云音乐开发--前后端交互

前后端交互 首先启动服务器 1. 根目录下执行: npm start 2. 服务器地址: http://localhost:3000 3. 示例: http://localhost:3000/banner 测试接口能不能用 发起请求 看接口说明,在wx的load函数中发起请求 请求成功 封装请求功能函数 …