力扣面试经典算法150题:整数转罗马数字

整数转罗马数字

今天的题目是力扣面试经典150题中的数组的中等难度题: 整数转罗马数字。

题目链接:https://leetcode.cn/problems/integer-to-roman/description/?envType=study-plan-v2&envId=top-interview-150

题目描述

七个不同的符号代表罗马数字,其值如下:

符号
I1
V5
X10
L50
C100
D500
M1000

罗马数字是通过添加从最高到最低的小数位值的转换而形成的。

将小数位值转换为罗马数字有以下规则:

  • 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
  • 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
  • 只有 10 的次方(I, X, C, M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式。

给定一个整数,将其转换为罗马数字。

  • 示例 1:

    • 输入:
      num = 3749

    • 输出:
      “MMMDCCXLIX”

    • 解释:

      3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
      700 = DCC 由于 500 (D) + 100 © + 100 ©
      40 = XL 由于 50 (L) 减 10 (X)
      9 = IX 由于 10 (X) 减 1 (I)

      注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位

  • 示例 2:

    • 输入:
      num = 58

    • 输出:
      “LVIII”

    • 解释:

      50 = L
      8 = VIII

  • 示例 3:

    • 输入:
      num = 1994

    • 输出:
      “MCMXCIV”

    • 解释:

      1000 = M
      900 = CM
      90 = XC
      4 = IV

题目分析

主要搞懂罗马字符和数字的转换逻辑就行。

前面做过简单题罗马字符转数字,这里反过来了,可以看看当时的题目是怎么解答的,帮助理解一下两者的转换。

传送门:罗马字符转数字

解题思路

罗马数字转换,我就想到一个暴力破解,无非就是暴力破解的时候转换值使用一点小技巧。

那么直接看代码吧。

实际算法代码

以下是暴力解答的代码实现:

public class IntegerToRoman {public static void main(String[] args) {IntegerToRoman solution = new IntegerToRoman();System.out.println(solution.intToRoman(3));       // 输出: "III"System.out.println(solution.intToRoman(4));       // 输出: "IV"System.out.println(solution.intToRoman(9));       // 输出: "IX"System.out.println(solution.intToRoman(94));       // 输出: "IX"System.out.println(solution.intToRoman(222));       // 输出: "IX"System.out.println(solution.intToRoman(666));       // 输出: "IX"}public String intToRoman(int num) {// 构建映射表int[][] map = {{1000, 500, 100, 50, 10, 5, 1},{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}};String[][] romanMap = {{"M", "D", "C", "L", "X", "V", "I"},{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}};StringBuilder sb = new StringBuilder();// 处理千位int thousands = num / 1000;while (thousands > 0) {sb.append(romanMap[0][0]);thousands--;}// 处理百位int hundreds = (num % 1000) / 100;while (hundreds > 0) {sb.append(romanMap[1][2]);hundreds--;}// 处理十位int tens = (num % 100) / 10;while (tens > 0) {sb.append(romanMap[1][4]);tens--;}// 处理个位int ones = num % 10;while (ones > 0) {sb.append(romanMap[1][6]);ones--;}// 优化特殊组合sb = optimize(sb);return sb.toString();}private StringBuilder optimize(StringBuilder sb) {// 优化特殊组合String s = sb.toString();StringBuilder optimized = new StringBuilder();// 处理千位optimized.append(s.replaceAll("DCCCC", "CM").replaceAll("CCCC", "CD"));// 处理百位optimized.append(s.replaceAll("LXXXX", "XC").replaceAll("XXXX", "XL"));// 处理十位optimized.append(s.replaceAll("VIIII", "IX").replaceAll("IIII", "IV"));return optimized;}}

结果

执行程序,符合要求
在这里插入图片描述
提交力扣,通过测试:
在这里插入图片描述

总结

今天的题目就是暴力解答,主要还是逻辑问题。做了这么久题目肯定没问题,不行就参考一下字符转数字,中间有一点共通之处帮助更好的理解两者间的转换。

加油!!!

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

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

相关文章

GitHub与Gitee密钥对配置

一、生成 Gitee 的 SSH 密钥对 打开终端: 在 Windows 上可以使用 Git Bash,或在其他操作系统上打开终端。 生成 Gitee SSH 密钥: ssh-keygen -t rsa -b 4096 -C "your_email_for_giteeexample.com" -f ~/.ssh/id_rsa_gitee这里的邮…

SprinBoot+Vue餐厅点餐系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

Python实现HTTP服务器

要在Python中实现一个简单的HTTP服务器,可以使用Python内置的库http.server,它是非常基础但足够演示基本HTTP服务的功能。 1. 导入必要的模块 首先,需要导入http.server和socketserver模块。http.server提供了基础的HTTP服务器功能&#xf…

探索 Linux 内核启动过程

目录 1. Linux 内核启动过程概述2. start_kernel (内核初始化)3. rest_init4. kernel_init5. kthreadd总结 1. Linux 内核启动过程概述 在 Linux (2.6.39.4)系统的启动过程中,内核扮演了至关重要的角色。它负责从系统启动开始,初始化硬件、管理内存、加…

stm32智能颜色送餐小车(ESP8266WIFI模块、APP制作、物联网模型建立、MQTTFX)

大家好啊,我是情谊,今天我们来介绍一下我最近设计的stm32产品,我们在今年七月份的时候参加了光电设计大赛,我们小队使用的就是stm32的智能送餐小车,虽然止步于省赛,但是还是一次成长的经验吧,那…

Byte Pair Encoding(BPE)算法原理以及其python实现

Byte Pair Encoding(BPE)是一种基于统计的压缩算法,最初由Gage于1994年在“A New Algorithm for Data Compression”一文中提出。尽管其初衷是用于数据压缩,但随着自然语言处理(NLP)的发展,BPE被广泛应用于词汇表构建和分词任务中,尤其是在处理形态丰富的语言时表现尤为…

【PostgreSQL教程】PostgreSQL 高级篇之 视图

博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

MySQL基本查询语言

基本查询语言的结构 最简单的查询语句: select...from.... 一个完整的普通查询语句结构如下: select [distinct].....from....[where....][group by .....][having.....][order by.....][limit.....] 查询语句的执行顺序 1. 先执行from子句:基于表进行…

如何结束monkey运行

引言 在 Android 开发过程中,monkey 测试是一种常用的随机测试手段,用于模拟用户的各种操作来发现应用中的稳定性问题。然而,在某些情况下,您可能需要提前结束正在进行的 monkey 测试,比如当您发现了一些重要的问题需…

java在项目中实现excel导入导出

一、初识EasyExcel* 1. Apache POI 先说POI,有过报表导入导出经验的同学,应该听过或者使用。 Apache POI是Apache软件基金会的开源函式库,提供跨平台的Java API实现Microsoft Office格式档案读写。但是存在如下一些问题: 1.1 …

SpringBoot 项目——抽奖系统

本项目主要实现的功能是:主要服务于管理员用户,其可圈选奖品,人员来创建抽奖活动,并进行在线抽奖,并可通过短信或邮件的方式通知中奖者,同时普通用户可查看已结束的抽奖活动的中奖结果; 一、项…

TESSY创建单元测试或集成测试工程

我们以tessy5.1 IDE为例,给大家展示工程的创建过程。 1、打开TESSY5.1软件后,会弹出: 2、点击NEW Project后,会弹出: 3、接下来,就可以打开刚创建的工程: 4、进入到TESSY的主界面后&#xff0c…

Python办公自动化 获取文本数据 支持多种类型文件

学好办公自动化,走遍天下都不怕!! 前面我们已经学习了,如何用python的下载安装以及入门基础知识,并且也知道如何使用python自动处理Excel文件数据、如何批量生成Word文件、如何对数据分析后生成洞察报告、如何用python实现自动发送…

React中实现antd自定义图标,鼠标悬浮变色

借助 antd 的 tooltip 组件来实现 hover 时变色的效果 1.新建组件 自定义图标一般在iconfont上面获取,复制下来的svg代码,切记要删除 fill 属性后添加到组件中 import { Tooltip } from "antd"; import React from "react";const …

一种后缀数组的奇妙运用

最近参加了thucamp,其中day5的E题是一个有难度的字符串。 大部分人都是用后缀自动机做,我也是这样感觉的,不过想了好一会儿也没有很清晰的思路,但是突然想到了一个用后缀数组建树的方法,我2h码了7kb的代码&#xff0c…

webpack4手动搭建Vue项目

小满视频 很多解释使用通义灵码搜的,通义灵码的搜索结果也是有错误的全程使用pnpm包管理工具,和npm的用法基本一样 学习总结 1. 多看看webpack官网 2. webpack的作用:配置一堆东西,达到运行程序的目的 3. 无论什么东西都转成js,…

理解数据库系统的内部结构

数据库系统在我们的数字世界中扮演着关键角色。本文将介绍数据库系统的内部结构,帮助初学者了解其基本概念。 数据库系统的三级模式 数据库系统内部采用三级模式二级映像结构,包括外模式、模式和内模式。这种结构确保了数据的逻辑独立性和物理独立性。…

51-java jpa和mybatis的区别

‌JPA和MyBatis是两种不同的持久层框架,它们在设计和使用上有显著的区别。‌ ‌JPA(Java Persistence API)‌ 是一个ORM(对象关系映射)框架,它是Java EE的一部分,旨在通过注解或XML配置来定义实…

CHAMELEON算法原理及Python实践

CHAMELEON(变色龙)算法是一种两阶段的层次聚类算法,其原理和特点可以归纳如下: 一、算法概述 CHAMELEON算法通过动态建模的方式,结合了数据的初始划分(通过图划分算法)和一种新颖的层次聚类方…

如何在Android项目中进行性能优化分析?

引言 在开发过程中,性能优化是一个重要的话题。用户对于应用的性能有着非常高的期望:快速启动、流畅的操作体验、低内存消耗等。那么,作为开发者,我们如何才能在项目中进行性能优化分析呢?今天就来和大家聊聊这个话题…