string 找出所有数字 index_发现规律,解决整数转罗马数字

68ceba8c99f9f9a6279b6ecc3970af6d.gif

898df2a218a2e3b3ff9e06f34ee3c96b.png

嗨,各位!我们又准时见面了,即将迎来难得的周末时光,我们今天来一道相对简单的题目逻辑梳理的题目,原定的动态规划的常见题型我们放在周末进行更新。话不多说,我们先看题目:  01 . 题目罗马数字包含以下七种字符:I, V, X, L,C,D 和 M。
字符数值
I1
V5
X10
L50
C100
D500
M1000
例如,2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。

这个特殊的规则只适用于以下六种情况:
  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。

示例 1:  输入: 3  输出: "III" 
示例 2:  输入: 4  输出: "IV" 
示例 3:  输入: 9  输出: "IX" 
示例 4:  输入: 58  输出: "LVIII" 解释: L = 50, V = 5, III = 3.
示例 5:  输入: 1994  输出: "MCMXCIV" 解释: M = 1000, CM = 900, XC = 90, IV = 4.
02 . 思路分析这道题整体看起来有明确的规则,只需要梳理清楚罗马数字的表示规律即可,那我们现在就开始发现规律:跟我们常用的阿拉伯数字表示十进制数字相同,罗马数字也通过十进制来表示,只是比我们的 0 1 2 3 4 5 的阿拉伯数字复杂一些,而且每一位用的是不同的字母表示。我们先把 0 - 9 的罗马数字拿出来找规律:
0123456789
IIIIIIIVVVIVIIVIIIIX
我们发现了如下规律:
  • 0 ~3  就是 0 到 3 个 罗马数字 ‘‘I’’ 表示
  • 4 就是 5 - 1 但是减数放在了前面 既 “IV”
  • 5 ~ 8 就是用 一个 罗马数字 “V” 加上 0 ~ 3 个 罗马数字 “I” 来表示
  • 9 就是 10 - 1 但是减数放在了前面 既 “IX”
如果我们把每一位数字分为两组 再去发现规律:
01234
IIIIIIIV
56789
VVIVIIVIIIIX
当 0 ~ 9 我们分别对5取余时,我们发现了更通用的一个规律:
  • 余 0 ~ 3 的时候是:(“空” 或者 “V” ) 加上 余数个“I”

  • 余 4 的时候是:“I” 加上一个 “X”

由此,我们确定了罗马数字的规律,一个十进制整数的每一位,都涉及到了三个罗马数字,并按照上述的逻辑去连接罗马数字即可:

如:个位就是 I V X 三个罗马数字,十位就是 X L D 三个罗马数字, 以此类推。到目前为止我们已经发现了具体规律,我们来尝试着编写代码:

/** * @param {number} num * @return {string} */var intToRoman = function(num) {    let result = []    let unit = ['I', 'V', 'X', 'L', 'C', 'D', 'M']        let index = 0    while(num){        let n = num % 10        let pre = n >= 5 ? unit[index + 1] : ''         let u1 = unit[index]        let u3 = unit[index + ((n >= 5) ? 2 : 1)] || ''        switch (n % 5) {            case 1:                pre += u1                break            case 2:                pre += u1 + u1                break            case 3:                pre += u1 + u1 + u1                break            case 4:                pre = u1 + u3                break        }        result.push(pre)        index += 2        num = Math.floor(num / 10)    }    return result.reverse().join('')};

这道题目的具体代码实现比较简单,我这里就不逐行注释了,有一个细节需要说明,就是我在处理每一位的时候是用的push()来存入结果数字,在返回答案是先reverse(),在进行数组元素连接成字符串。

原因就是对于同样的结果操作,push() + reverse() 的操作 比 unshift() 操作快一些,这应该是js的引擎实现决定的,有更深入了解的同学欢迎留言去解释一下~。

在leetcode上,为了更快的运行结果,还可以用一些预先计算并直接体现在代码上,因为本题的要求是罗马数字在1 ~ 3999的范围,所以罗马数字组合只有四种,可以直接列出来。我们看一下leetcode上这道题目前最快的代码示例:

/** * @param {number} num * @return {string} */var intToRoman = function(num) {    function TurnFive(n, one, five, ten){        if(n != 0){            if(n < 4){                return one.repeat(n);            }            if(n == 4){                return one + five;            }            if(n < 9){                let times = n-5;                let I = one.repeat(times)                return five + I;            }            if(n == 9){                return one + ten;            }                    }        return "";    }    let than = Math.floor(num / 1000);    let hon = Math.floor(num % 1000 / 100);    let ten = Math.floor(num % 1000 % 100 /10);    let ge = Math.floor(num % 1000 %100 % 10);    return TurnFive(than, "M", "", "") +             TurnFive(hon, "C", "D", "M") +             TurnFive(ten, "X", "L", "C") +             TurnFive(ge, "I", "V", "X");};

这种针对具体题目的优化在一些online judge的比赛中很常见,不过它的扩展性就会弱一些, 比如 范围要求是 1 ~3999999 那需要在代码中直接列出来的内容就有点多了。所以还是发现规律,写出更通用的代码才是我们追求的。

这道题到这里就结束了,大家可以自己练练手,最后祝大家周末愉快,明天我会做一个《动态规划解题的常见题集合》,不过只有一道题会从头开始分析,剩下的题目只讲解思路和特征,也算是给大家留一个联系的机会,让大家真是的练练手。

如果你觉得文章的内容能给你带来收获,欢迎关注 + 点赞在看 + 转发,更期待你能推荐给身边的小伙伴,让我们一起来梳理前端知识!一起加油!「 往期回顾 」

动态规划(DP)解积雨问题

动态规划(DP)解最大连续子序列

4dfba5d518373f711b2e346677851bdd.png

文章涉及到源码已经在github中开源

请在公众号中发送“源码”获取代码地址

让我知道你在看

a7dd662c60e9063684a227ad68aeaf7c.gif

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

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

相关文章

ASP.NET MVC的路由

好久没写博文了&#xff0c;感觉最近好像少了点动力。唉&#xff01;这回就看看这个MVC的路由。 说这个路由机制其实不是MVC里面特有的&#xff0c;ASP.NET里面本身就有的&#xff0c;只不过在WebForm里面一般比较少用&#xff0c;而在MVC里就是把原本的路由扩展了。原本对不知…

win32 ipv6 sendto recvfrom

1. sendto 在windows xp下进行ipv6的udp网络通信时&#xff0c;目标地址应该像如下方式构造 addrinfo hins, *res; memset(&hins, 0, sizeof(hins)); hins.ai_family AF_INET6; hins.ai_socktype SOCK_DGRAM; hins.ai_protocal IPPROTO_UDP; hins.ai_flags AI_NUERICH…

vscode python环境配置_用VScode配置Python开发环境

前言VScode是一个相当优秀的IDE&#xff0c;具备开源、跨平台、模块化、插件丰富、启动时间快、颜值高、可高度定制等等优秀的特质&#xff0c;不愧是微软爸爸的私生子。所以用VScode来编写Python&#xff0c;也是相当的好用的。所以&#xff0c;今天我们就来讲讲&#xff0c;怎…

java情书_Java情书已写好,就差妹子了!

我是Java程序员我用我的方式表达对你的爱&#xff01;我能抽象出整个世界...但是我却不能抽象出你...你肯定是一个单例&#xff0c;因为你是那样的独一无二...所以我的世界并不完整...我可以重载甚至覆盖这个世界里的任何一种方法...但是却不能覆盖对你的思念...也许命中注定了…

JS中的正则表达式小小的技巧---TEST方法的使用

TEST 方法 返回一个 Boolean 值&#xff0c;它指出在被查找的字符串中是否存在模式。 rgexp.test(str) 参数 rgexp 必选项。包含正则表达式模式或可用标志的正则表达式对象。 str 必选项。要在其上测试查找的字符串。 说明 test 方法检查在字符串中是否存在一个模式&#xff0c…

windows下手动配置ipv6地址

在XP,2003等早期版本中&#xff0c;ipv6地址在“网络连接”的属性配置里是无法手工配置的&#xff0c;只能使用netsh配置。配置方法如下&#xff1a;首先&#xff0c;安装IPV6协议&#xff0c;ipv6 install 第二步&#xff0c;查看当前使用的本地连接信息&#xff1a; 如上图&a…

python10的因数_十五道Python小案例,学会这些,Python基础已过关!

十五道Python的小案例&#xff0c;不知道各位都会了多少&#xff01;一、猜数字1到4能组成多少个互不相同且不重复数字的三位数&#xff1f;分别是&#xff1f;分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。程序源代…

java 幽灵引用_Java 幽灵引用的作用

原标题&#xff1a;Java 幽灵引用的作用来源&#xff1a;imzoer&#xff0c;blog.csdn.net/imzoer/article/details/8044900找实习的时候&#xff0c;面试大摩&#xff0c;就遇到了这个问题&#xff0c;当时真不该跟面试官交流这个内容的。垃圾收集过程中&#xff0c;对象的可触…

unique_ptr使用简介

我们知道auto_ptr通过复制构造或者通过赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如我们不希望多个内存块被多个智能指针对象共享,同时又不会像auto_ptr那样不知不觉的就让原来的a…

python访问共享文件夹 exist false_python os.path.exists()对于存在的nfs挂载目录文件失败...

我基本上有一个网站的网站服务器,另一个只存储文件.文件服务器通过挂载其中一个目录连接到主文件服务器.该网站运行Django所以我主要处理python.无论如何,我似乎遇到了一些问题,即文件被报告为不存在,即使它们实际存在.基本上当我打电话时filepath /path/to/file/on/nfs/share…

什么是CouchDB?

※本文对CouchDB的解释是来自Apache CouchDB的官网的译文&#xff0c;如果有什么问题&#xff0c;请指正。 1.CouchDB简介 CouchDB是一种利用JSON文件&#xff0c;javascript作为MapReduce查询&#xff0c;以及常规HTTP作为API的一种数据库系统。 2.CouchDB&#xff0c;一个为W…

java assembly 打包_maven 使用assembly 进行打包的方法

1. pom 中添加assembly 插件要使用assembly 进项编译打包&#xff0c; 首先主要在pom 中的build中添加插件信息&#xff0c; 具体如图下所示&#xff1a;${project.artifactId}src/main/javasrc/main/resourcestrue**/*.xml**/*.properties${profile.dir}trueorg.apache.maven.…

rt5350 中断处理分析

1. arch/mips/kernel/genex.S j plat_irq_dispatch 2. arch/mips/rt2880/irq.c plat_irq_dispatch rt2880_irqdispatch do_IRQ do_IRQ定义在 include/asm-mips/irq.h 这个头文件中&#xff0c;asm-mips这个目录链接到asm这里&#xff0c;所以在 arch/mips/rt2880/ir…

python json数据格式数组内元素递增赋值_利用Python实现JSON格式数据的编码与解码操作...

导读JSON (全称&#xff1a;JavaScript Object Notation )是一种轻量级的数据交换格式&#xff0c;所谓的轻量级&#xff0c;是与 XML 数据结构相比而言的&#xff0c;在描述相同的数据下&#xff0c;JSON 所需的字符比XML 的要少&#xff0c;这就意味着相同意义的数据&#xf…

java注解中可使用对象_Java注解(二):实战 - 直接使用对象列表生成报表...

通过对Java注解(一)&#xff1a;介绍&#xff0c;思想及优点学习了解&#xff0c;相信大家对Java注解有一定程度的了解&#xff0c;本篇文章将实战项目中的应用来加深对Java注解的了解。本实例实现根据指定字段的JavaBean,生成对应列的报表。使用Java注解就是方便实现JavaBean与…

ASP.NET WebForm中使用WebApi

添加webapi.dll 可现在添加。 在WebForm使用WebApi需要在全局文件里配置路由。 using System.Web.Routing;protected void Application_Start(object sender, EventArgs e){RegisterRoutes(RouteTable.Routes);}public static void RegisterRoutes(RouteCollection routes){//C…

rt5350 中断初始化

linux 下的中断初始化&#xff0c;实际就是对 irq_desc 这个结构体进行初始化&#xff0c;其中最关键莫过于 irq_flow_handler_t handle_irq 中断处理函数 struct irqaction *action 用户自己设置的处理函数链表&#xff0c;由hand…

VS2010安装异常中断后无法安装的解决方法(安装时发生严重错误)

最近&#xff0c;因为公司开发的需要&#xff0c;对开发环境进行全面的升级&#xff0c;在这其中也遇到了不少问题&#xff0c;在之后将陆续整理出来&#xff0c;以便以后查看。 之前开发环境&#xff1a;ArcGIS9.3&#xff0c;ArcEngine9.3&#xff0c;Oracle10g&#xff0c;A…

python自动下载邮件_python实现邮件自动化

1、自动接收邮件并且下载附件&#xff0c;使用pop3协议。# 接收邮件并下载邮件附件import poplibimport emailimport datetimeimport timefrom email.parser import Parserfrom email.header import decode_headerimport tracebackimport telnetlibimport sys# from email.util…

将5350 i2c clk设置为gpio 中断模式的方法

5350和我之前用的三星和全志的芯片在中断这块有点差别&#xff0c;三星和全志的都是有专门的外部中断管脚&#xff0c;并且每个中断管脚对应一个中断号&#xff0c;对管脚寄存器的配置即irq_desc里chip变量&#xff0c;都是bsp里自带的&#xff0c;我们只需要用request_irq来注…