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

news2024/11/24 14:38:46

整数转罗马数字

今天的题目是力扣面试经典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.coloradmin.cn/o/2086424.html

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

相关文章

【EI稳定检索】2024年第三届环境工程与可持续能源国际会议

2024年第三届环境工程与可持续能源国际会议(EESE 2024)将于12月20日至22日在长沙举行,由西安交通大学等支持,EI检索,投稿截止10月18日,AC学术中心提供技术支持和免费投稿系统。 2024年第三届环境工程与可持…

鸿蒙(API 12 Beta3版)【默认界面扫码】

基本概念 默认界面扫码能力提供系统级体验一致的扫码界面,Scan Kit对系统相机权限进行了预授权,调用接口时,无需开发者再次申请相机权限。适用于不同扫码场景的应用开发。 说明 通过默认界面扫码可以实现应用内的扫码功能,为了…

机器学习:TF-IDF算法原理及代码实现

TF-IDF是一种用于信息检索与文本挖掘的常用加权技术。它是一种统计方法,用以评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。它的主要思想是:如果某个词语在一篇文章中出现的频率高(Term Frequency,TF&#…

路别走窄了,华为认证的这些方向,比数通值钱

华为认证作为全球领先的ICT技术认证之一,以其高标准和权威性在全球范围内受到认可。它不仅代表了专业技能的国际水平,更是IT专业人士职业生涯中的重要里程碑。但谈论起华为认证,似乎大家都默认首选数通。 不止在华为认证,而是在整…

10个伪原创软件,改写文章效率高

在内容为王的时代,高效地改写文章已成为许多创作者和营销人员必备的技能。伪原创软件作为提升工作效率的利器,可以帮助用户在短时间内生成质量上乘的全新内容。以下是10个备受推崇的伪原创软件,它们各具特色,能够助力创作者大幅提…

猫头虎 分享已解决Bug || ReferenceError: Can‘t find variable: React 解决方案

猫头虎 分享已解决Bug || ReferenceError: Cant find variable: React 解决方案 今天猫头虎要跟大家分享一个前端开发中常见的问题: ReferenceError: Cant find variable: React。这个错误常常出现在我们开发React项目时,特别是在新手刚接触React或者是团…

如何快速创建个性化视频二维码用于产品宣传

产品视频二维码营销推广在实际应用中具有广泛的用途,可以有效地帮助企业推广品牌、产品和服务。常见的应用场景有:产品广告和宣传材料、产品包装展示、展会和活动、店内展示、旅游和景点介绍等。 那么如何快速制作和创建带企业图标的产品视频二维码呢&am…

【香橙派系列教程】(十九) 使用文件编程实现开关盖的历史记录

【十九】使用文件编程实现开关盖的历史记录 我现在多了一个需求,我需要在每次识别垃圾时,将垃圾的种类记录下来,同时记录下时间。 Linux显示当前的时间:date指令 //打印当前的 “年-月-日-时-分-秒” date "%Y-%m-%d %H:%M:…

开环响应(频率响应+相移响应)+闭环响应(负反馈对带宽的影响+增益-带宽积)+正反馈与稳定性/补偿(选学)

2024-8-29,星期四,20:01,天气:晴,心情:晴。今天没什么事情发生,继续学习。 今天完成了第七章的学习,主要学习内容为:开环响应(频率响应相移响应)闭环响应(负反馈对带宽的…

鸿蒙开发入门day15-焦点事件

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ) 目录 焦点事件 基础概念与规范 基础概念 走焦规范 走焦算法 获焦/失…

Layer Normalization(层归一化)里的可学习的参数

参考pyttorch官方文档: LayerNorm — PyTorch 2.4 documentation 在深度学习模型中,层归一化(Layer Normalization, 简称LN)是一种常用的技术,用于稳定和加速神经网络的训练。层归一化通过对单个样本内的所有激活进行…

各种数据降维方法ICA、 ISOMAP、 LDA、LE、 LLE、MDS、 PCA、 KPCA、SPCA、SVD、 JADE

独立分量分析 ICA 等度量映射 ISOMAP 线性判别分析 LDA (拉普拉斯)数据降维方法 LE 局部线性嵌入 LLE 多维尺度变换MDS 主成分分析 PCA 核主成分分析 KPCA 稀疏主成分分析SPCA 奇异值分解SVD 特征矩阵的联合近似对角化 JADE 各种数据降维方法(matlab代码)代码获取戳此处代码获取…

一篇文章讲清楚Java中的反射

介绍 每个类都有一个 Class 对象,包含了与类有关的信息。当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象。 类加载相当于 Class 对象的加载。类在第一次使用时才动态加载到 JVM 中,可以使用 Class…

组件通信 Vue3

1.props 1.child <template><div class"child"><h3>子组件</h3><h4>玩具&#xff1a;{{ toy }}</h4><h4>父给的车&#xff1a;{{ car }}</h4><button click"sendToy(toy)">把玩具给父亲</butt…

Python进阶03-闭包和装饰器

零、文章目录 Python进阶03-闭包和装饰器 1、作用域 &#xff08;1&#xff09;作用域 在Python代码中&#xff0c;作用域分为两种情况&#xff1a; 全局作用域局部作用域 &#xff08;2&#xff09;变量的作用域 随着函数的出现&#xff0c;作用域被划分为两种 在全局定…

江协科技STM32学习- P7 GPIO输入

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

docker安装AWVS15(网络拉取失败,提供百度云镜像下载)

一.背景 准备在服务器上安装AWVS15用于扫描&#xff0c;直接拉取一直提示网络错误&#xff0c;刚好本地上有容器&#xff0c;就直接将本地的AWVS容器打包上传了&#xff0c;顺带上传到百度云来避免今后直接拉取网络出错的情况。考虑到其他师傅可能也会遇到相似问题&#xff0c…

最新高仿拼夕夕源码/拼单系统源码/拼单商城/类目功能齐全

源码简介&#xff1a; 高仿拼夕夕源码&#xff0c;拼单商城系统源码、拼团商城源码&#xff0c;改的版本。拼夕夕拼团商城系统源码源码 多商户多区域拼团系统源码。 自己改的版本&#xff0c;类似于拼单的商城&#xff0c;功能齐全&#xff0c;看着还挺不错&#xff0c;绝对值…

上新!Matlab实现基于QRGRU-Attention分位数回归门控循环单元注意力机制的时间序列区间预测模型

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRGRU-Attention分位数回归门控循环单元注意力机制的时间序列区间预测模型&#xff1b; 2.多图输出、多指标输出(MAE、RMSE、MSE、R2)&#xff0c;多输入单输出&#xff0c;含不同置信区间图、概率…

多任务学习MTL模型:多目标Loss优化策略

前言 之前的文章中多任务学习MTL模型&#xff1a;MMoE、PLE&#xff0c;介绍了针对多任务学习的几种模型&#xff0c;着重网络结构方面的优化&#xff0c;减缓task之间相关性低导致梯度冲突&#xff0c;模型效果差&#xff0c;以及task之间的“跷跷板”问题。 但其实多任务学…