leetcode12 整数转罗马数字

 题目描述:给定一个整数,将其转换为罗马数字。罗马数字由七个字符表示:I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。通常情况下,小的数字位于大的数字的右边。但有特殊情况,如4表示为IV(5-1),9表示为IX(10-1),40表示为XL(50-10),90表示为XC(100-10),400表示为CD(500-100),900表示为CM(1000-100)。编写一个程序,将给定的整数转换为相应的罗马数字表示。

示例:

 输入: num = 1994

输出: "MCMXCIV"

解释: M = 1000, CM = 900, XC = 90, IV = 4. 

方法1 模拟(来源于力扣官解)

思路:给定一个数字number,找到不超过该数字的罗马符号对应的值(这个值应为最大的那个),比如1100这个数字,为1000;888则为500;然后循环往复,按这个套路一直减,然后得到的对应罗马符号挨个拼起来,直到无法再减,也就是他喵的这个数字最后为0,停止运行,下面以特定的数字进行演示,如下图所示:

c++完整代码: 

#include<iostream>
#include<vector>using namespace std;//创建一个名为valueSymbols的pair,并进行初始化
const pair<int, string> valueSymbols[] = {{1000, "M"},{900,"CM"},{500,"D"},{400,"CD"},{100,"C"},{90,"XC"},{50,"L"},{40,"XL"},{10,"X"},{9,"IX"},{5,"V"},{4,"IV"},{1,"I"},
};class Solution{
public:string intToRoman(int num){string roman;for(const auto &[value,symbol]:valueSymbols){while(num > value){num -= value; //当前数减去特定的罗马字符对应的数字roman += symbol; //罗马字符进行累加}if(num == 0){ //当前数字为0时break;}}return roman;//返回罗马字符}
};
int main(){int number = 3333;Solution solution;std::string roman = solution.intToRoman(number);std::cout << number << "into roman digital: " << roman <<endl;//输出结果return 0;
}
//创建一个名为valueSymbols的pair,并进行初始化
const pair<int, string> valueSymbols[] = {{1000, "M"},{900,"CM"},{500,"D"},{400,"CD"},{100,"C"},{90,"XC"},{50,"L"},{40,"XL"},{10,"X"},{9,"IX"},{5,"V"},{4,"IV"},{1,"I"},
};class Solution{
public:string intToRoman(int num){string roman;for(const auto &[value,symbol]:valueSymbols){while(num > value){num -= value; //当前数减去特定的罗马字符对应的数字roman += symbol; //罗马字符进行累加}if(num == 0){ //当前数字为0时break;}}return roman;//返回罗马字符}
};

java完整代码: 

public class IntToRoman {// 定义罗马数字的值和对应的符号int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};// 将整数转换为罗马数字的方法public String intToRoman(int num) {//StringBuffer 是 Java 中的一个类,用于处理可变的字符序列。//与 String 类不同,StringBuffer 的长度和内容可以被修改,而不需要创建新的对象。//这使得 StringBuffer 在需要频繁修改字符串的情况下更为高效,因为它避免了创建大量临时对象//常用方法://append(String str): 将指定的字符串追加到当前字符串的末尾//insert(int offset, String str): 在指定位置插入指定的字符串//delete(int start, int end): 删除指定范围内的字符//replace(int start, int end, String str): 用新字符串替换指定范围内的字符//reverse(): 反转字符串的内容//toString(): 将 StringBuffer 对象转换为字符串StringBuffer roman = new StringBuffer();for (int i = 0; i < values.length; ++i) {int value = values[i];String symbol = symbols[i];// 循环将当前值的符号加入结果,直到整数小于当前值while (num >= value) {num -= value;roman.append(symbol);//将指定的字符串追加到当前字符串的末尾}// 如果整数为0,结束循环if (num == 0) {break;}}return roman.toString(); //将 StringBuffer 对象转换为字符串}// 主函数,用于测试整数转换为罗马数字public static void main(String[] args) {IntToRoman converter = new IntToRoman(); // 创建 IntToRoman 类的实例int number = 3333;String roman = converter.intToRoman(number);System.out.println(number + " 转换成罗马数字为: " + roman);}
}

public class IntToRoman {// 定义罗马数字的值和对应的符号int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};// 将整数转换为罗马数字的方法public String intToRoman(int num) {//StringBuffer 是 Java 中的一个类,用于处理可变的字符序列。//与 String 类不同,StringBuffer 的长度和内容可以被修改,而不需要创建新的对象。//这使得 StringBuffer 在需要频繁修改字符串的情况下更为高效,因为它避免了创建大量临时对象//常用方法://append(String str): 将指定的字符串追加到当前字符串的末尾//insert(int offset, String str): 在指定位置插入指定的字符串//delete(int start, int end): 删除指定范围内的字符//replace(int start, int end, String str): 用新字符串替换指定范围内的字符//reverse(): 反转字符串的内容//toString(): 将 StringBuffer 对象转换为字符串StringBuffer roman = new StringBuffer();for (int i = 0; i < values.length; ++i) {int value = values[i];String symbol = symbols[i];// 循环将当前值的符号加入结果,直到整数小于当前值while (num >= value) {num -= value;roman.append(symbol);//将指定的字符串追加到当前字符串的末尾}// 如果整数为0,结束循环if (num == 0) {break;}}return roman.toString(); //将 StringBuffer 对象转换为字符串}}

 Python完整代码:

class Solution:# 创建一个名为value_symbols的列表,并进行初始化value_symbols = [(1000, "M"),(900, "CM"),(500, "D"),(400, "CD"),(100, "C"),(90, "XC"),(50, "L"),(40, "XL"),(10, "X"),(9, "IX"),(5, "V"),(4, "IV"),(1, "I"),]def intToRoman(self, num):roman = list()for value, symbol in Solution.value_symbols:while num >= value:num -= value  # 当前数减去特定的罗马字符对应的数字roman.append(symbol)  # 在列表后添加罗马字符if num == 0:  # 当前数字为0时breakreturn "".join(roman)  # 返回罗马字符number = 3333  # 设置当前数字
solution = Solution()  # 实例化
result = solution.intToRoman(number)
print("整数转罗马数字为:", result)
class Solution:# 创建一个名为value_symbols的列表,并进行初始化value_symbols = [(1000, "M"),(900, "CM"),(500, "D"),(400, "CD"),(100, "C"),(90, "XC"),(50, "L"),(40, "XL"),(10, "X"),(9, "IX"),(5, "V"),(4, "IV"),(1, "I"),]def intToRoman(self, num):roman = list()for value, symbol in Solution.value_symbols:while num >= value:num -= value  # 当前数减去特定的罗马字符对应的数字roman.append(symbol)  # 在列表后添加罗马字符if num == 0:  # 当前数字为0时breakreturn "".join(roman)  # 返回罗马字符

方法2 硬编码(来源于力扣官解)

从上面模拟的方法我们可以看出,共有13组罗马符号,然后我们可以发现千位数字上有且仅有M这一种表示方法,当超过9999时,加入10001,也只是由10个M和1个I组成,百位上只可以由C、CD、D、CM组成,十位数字只能由X、XL、L、XC组成,个位数字只能由I、IV、V、IX组成,将这些数字组合成一个表:

可以看出每一位之上罗马符号都是不同的,因此可以采用“对号入座”的方法进行编码,相当于在千百十个位上分别求出对应的0 1 2 3 4 5 6 7 8 9,然后再去找到对应的罗马符号,最后返回得到的结果就ok了。那么怎样求出千百十个位上对应的数字呢?这时候就需要用到模运算和除法运算了:

以python为例:

c++完整代码:  

#include <iostream>
using namespace std;// 罗马数字的千位表示
const string thousands[] = {"", "M", "MM", "MMM", "MMMM", "MMMMM","MMMMMM", "MMMMMMM", "MMMMMMMM", "MMMMMMMMM"};
// 罗马数字的百位表示
const string hundreds[] ={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
// 罗马数字的十位表示
const string tens[] = {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
// 罗马数字的个位表示
const string ones[] = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
// 定义 Solution 类
class Solution {
public:// 将整数转换为罗马数字的方法string intToRoman(int num) {return thousands[num / 1000] +hundreds[num % 1000 / 100] +tens[num % 100 / 10] +ones[num % 10];}
};// 主函数
int main() {// 待转换的整数int number = 9999;// 创建 Solution 类的实例Solution solution;// 调用方法将整数转换为罗马数字string roman = solution.intToRoman(number);// 输出转换结果cout << number << " 转换成罗马数字为: " << roman << endl;// 返回执行成功return 0;
}

java完整代码: 

public class intToRoman1 {// 罗马数字的千位表示String[] thousands = {"", "M", "MM", "MMM", "MMMM", "MMMMM","MMMMMM", "MMMMMMM", "MMMMMMMM", "MMMMMMMMM"};// 罗马数字的百位表示String[] hundreds ={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};// 罗马数字的十位表示String[] tens = {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};// 罗马数字的个位表示String[] ones = {"","I","II","III","IV","V","VI","VII","VIII","IX"};// 将整数转换为罗马数字的方法public String intToRoman(int num){StringBuffer roman = new StringBuffer();roman.append(thousands[num / 1000]);  // 千位roman.append(hundreds[num % 1000 / 100]);  // 百位roman.append(tens[num % 100 / 10]);  // 十位roman.append(ones[num % 10]);  // 个位return roman.toString();}// 主函数,用于测试整数转换为罗马数字public static void main(String[] args){intToRoman1 converter = new intToRoman1();  // 创建 intToRoman1 类的实例int number = 9999;String roman = converter.intToRoman(number);System.out.println(number + " 转换成罗马数字为: " + roman);}
}

python完整代码: 

class Solution:# 罗马数字的千位表示thousands = ["", "M", "MM", "MMM", "MMMM", "MMMMM","MMMMMM", "MMMMMMM", "MMMMMMMM", "MMMMMMMMM"]# 罗马数字的百位表示hundreds = ["", "C", "CC", "CCC", "CD", "D","DC", "DCC", "DCCC", "CM"]# 罗马数字的十位表示tens = ["", "X", "XX", "XXX", "XL", "L","LX", "LXX", "LXXX", "XC"]# 罗马数字的个位表示ones = ["", "I", "II", "III", "IV", "V","VI", "VII", "VIII", "IX"]# 将整数转换为罗马数字的方法def intToRoman(self, num):return (Solution.thousands[num // 1000] +Solution.hundreds[num % 1000 // 100] +Solution.tens[num % 100 // 10] +Solution.ones[num % 10])# 设置当前数字
number = 3333
# 实例化 Solution 类
solution = Solution()
# 调用方法将整数转换为罗马数字
result = solution.intToRoman(number)
# 输出转换结果
print("整数转罗马数字为:", result)

方法3 贪心哈希表

具体算法的流程如下图所示:

 python完整代码:

class Solution:def intToRoman(self, num):hashmap = {1000: "M", 900: "CM", 500: "D", 400: "CD",100: "C", 90: "XC", 50: "L", 40: "XL", 10: "X",5: "V", 4: "IV", 1: "I"}roman = ''for key in hashmap:if num // key != 0:  # 当前数字除以哈希表中对应的值不等于0时count = num // key  # 计算当前位上的数字(对应哈希中key的个数)roman += hashmap[key] * count  # 罗马符号进行累加num %= key  # 计算剩余的数return roman# 设置当前数字
number = 3333
# 实例化Solution类
solution = Solution()
# 调用方法将整数转换为罗马数字
result = solution.intToRoman(number)
# 输出转换结果
print("整数转罗马数字为:", result)

  c++完整代码:

#include<iostream>using namespace std;
class Solution{
public:string intToRoman(int num){int values[] = {1000, 900, 500, 400, 100, 90,50, 40, 10, 9, 5, 4, 2, 1};string romans[] = {"M", "CM", "D", "CD", "C", "XC","L", "XL", "X", "IX", "V", "IV", "I"};string roman;for(int i = 0;i < 13; i++){while(num >= values[i]){num -= values[i];roman += romans[i];}}return roman;}
};
int main() {// 待转换的整数int number = 9999;// 创建 Solution 类的实例Solution solution;// 调用方法将整数转换为罗马数字string roman = solution.intToRoman(number);cout << number << " into roman digital " << roman << endl;// 输出转换结果return 0; // 返回执行成功
}

Java完整代码:

import java.util.HashMap;public class intToRoman2 {public String intToRoman(int num) {HashMap<Integer, String> hashmap = new HashMap<>();hashmap.put(1000, "M");hashmap.put(900, "CM");hashmap.put(500, "D");hashmap.put(400, "CD");hashmap.put(100, "C");hashmap.put(90, "XC");hashmap.put(50, "L");hashmap.put(40, "XL");hashmap.put(10, "X");hashmap.put(9, "IX");hashmap.put(5, "V");hashmap.put(4, "IV");hashmap.put(1, "I");StringBuilder roman = new StringBuilder();for (int key : hashmap.keySet()) {while (num >= key) {roman.append(hashmap.get(key));num -= key;}}return roman.toString();}public static void main(String[] args) {// 设置当前数字int number = 3333;// 实例化 IntToRoman 类IntToRoman converter = new IntToRoman();// 调用方法将整数转换为罗马数字String result = converter.intToRoman(number);// 输出转换结果System.out.println("整数转罗马数字为: " + result);}
}

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

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

相关文章

视频剪辑技巧:添加srt字幕,提升视频品质的方法

在视频制作和剪辑过程中&#xff0c;字幕的添加是一项常见的技巧。通过添加srt字幕&#xff0c;可以提升视频的品质和观感&#xff0c;让观众更好地理解视频内容。下面一起来看云炫AI智剪如何批量添加srt字幕的方法&#xff0c;如何通过这些技巧提升视频品质。 原视频画面与添…

JAVA中小型医院信息管理系统源码 医院系统源码

开发框架&#xff1a;SpringBootJpathymeleaf 搭建环境&#xff1a;jdk1.8idea/eclipsemaven3mysql5.6 基于SpringBoot的中小型医院信息管理系统&#xff0c;做的比较粗糙&#xff0c;但也实现了部分核心功能。 就诊卡提供了手动和读卡两种方式录入&#xff0c;其中IC读卡器使用…

基于YOLOv7算法的高精度实时水上漂浮物目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时水上漂浮物目标检测系统可用于日常生活中检测与定位bottle&#xff08;塑料瓶&#xff09;, grass&#xff08;野草&#xff09;, branch&#xff08;树枝&#xff09;, milk-box&#xff08;牛奶盒&#xff09;, plastic-bag&#…

【Spring Boot 源码学习】SpringApplication 的定制化介绍

Spring Boot 源码学习系列 SpringApplication 的定制化介绍 一、引言二、往期内容三、主要内容1. 基础配置1.1 设置关闭 Banner1.2 设置自定义 Banner 打印对象1.3 设置应用程序主入口类1.4 设置用于创建应用程序上下文的工厂1.5 添加 BootstrapRegistry 初始化器实现1.6 设置或…

Java-IO流-15

文件操作 文件创建 package com.edu.file;import org.junit.jupiter.api.Test;import java.io.File; import java.io.IOException;public class Demo01 {public static void main(String[] args) {}Test//方式1public void create01(){String filePath "D:\\new1.txt&q…

算法第十三天-组合总和Ⅱ

组合总和Ⅱ 题目要求 解题思路 按顺序搜索&#xff0c;设置合理的变量&#xff0c;在搜索的过程中判断是否会出现重复集结果。重点理解对输入数组排序的作用和参考代码中 大剪枝和小剪枝 的意思 这道题域上一问的区别在于&#xff1a; 第39题&#xff1a;candidates中的数字…

华为云Sys-default、Sys-WebServer和Sys-FullAccess安全组配置规则

华为云服务器默认安全组可选Sys-default、Sys-WebServer或Sys-FullAccess。default是默认安全组规则&#xff0c;只开放了22和3389端口&#xff1b;Sys-WebServer适用于Web网站开发场景&#xff0c;开放了80和443端口&#xff1b;Sys-FullAccess开放了全部端口。阿腾云atengyun…

ReentrantLock底层原理学习二

以 ReentrantLock 作为切入点&#xff0c;来看看在这个场景中是如何使用 AQS 来实现线程的同步的 ReentrantLock 的时序图 调用 ReentrantLock 中的 lock()方法&#xff0c;源码的调用过程我使用了时序图来展现。ReentrantLock.lock() 这个是 reentrantLock 获取锁的入口 pu…

PPT模板(100套IT科技互联网风)

哈喽&#xff0c;小伙伴们&#xff0c;最近是不是都在准备年终总结、年终述职&#xff0c;一个好的PPT模板是编写报告的开端。我最近也在准备年终总结报告&#xff0c;一块整理了一些PPT模板。这些模板适用于各种IT科技互联网相关的场合&#xff0c;如产品发布会、项目提案、工…

案例081:基于微信小程序的移动平台的远程在线诊疗系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

MybatisPlus—自定义SQL

目录 1. 自定义SQL介绍 2. 自定义SQL使用步骤 3. 自定义SQL实例 4.总结 1. 自定义SQL介绍 介绍&#xff1a;自定义SQL并不是由我们来编写全部SQL语句&#xff0c;而是通过利用MyBatisPlus的Wrapper来构建复杂的Where条件&#xff0c;然后自己定义SQL语句中剩下的部分。 使…

【AI视野·今日CV 计算机视觉论文速览 第283期】Thu, 4 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Thu, 4 Jan 2024 Totally 85 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers LEAP-VO: Long-term Effective Any Point Tracking for Visual Odometry Authors Weirong Chen, Le Chen, Rui Wang, Marc P…

13年测试老鸟,性能测试-全链路压测总结,一文打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、什么是全链路压…

2023湾区产城创新大会:培育数字化供应链金融新时代

2023年12月26日&#xff0c;由南方报业传媒集团指导&#xff0c;南方报业传媒集团深圳分社主办的“新质新力——2023湾区产城创新大会”在深圳举行。大会聚集里国内产城研究领域的专家学者以及来自产业园区、金融机构、企业的代表&#xff0c;以新兴产业发展为议题&#xff0c;…

Godot4.2——爬虫小游戏简单制作

目录 一、项目 二、项目功能 怪物 人物 快捷键 分数 游戏说明 提示信息 三、学习视频 UI制作 游戏教程 四、总结 一、项目 视频演示&#xff1a;Godot4爬虫小游戏简单制作_哔哩哔哩bilibili 游戏教程&#xff1a;【小猫godot4入门教程 C#版 已完结】官方入门案例 第…

云渲染有几种方式?适合设计师的渲染方式是哪种?

云渲染是很多公司首选的渲染方式&#xff0c;它能加快渲染速度提高工作效率&#xff0c;那么云渲染有几种渲染方式呢&#xff1f;这次我们一起来看看。 1、离线渲染 离线渲染也被称作预渲染&#xff0c;通常用于对真实感和复杂细节有高要求的场合&#xff0c;如电影、动画、特效…

深度学习数据集大合集—鱼类数据集

最近收集了一大波有关于各类鱼类的数据集&#xff0c;有淡水鱼、有深海鱼、有鱼的状态、有鱼的分类。大家可以详细查看。废话不多说&#xff0c;接下下来逐一的给大家介绍&#xff01;&#xff01; 1、鱼类检测数据集 包含鱼类的对象检测数据集 本数据集包含4种鱼类及其相关…

移动通信原理与关键技术学习(3)

1.什么是相干解调&#xff1f;什么是非相干解调&#xff1f;各自的优缺点是什么&#xff1f; 相干解调需要在接收端有一个与发送端一样的载波&#xff08;同样的频率和相位&#xff09;&#xff0c;在接收端的载波与发送端载波进行互相关操作&#xff0c;去除载波的影响。相干…

如何使用 CMake 生成一个静态库

文章目录 tutorial_3/CMakeLists.txttutorial_3/src/CMakeLists.txtcmake_tutorial/tutorial_3/src/hello.cpptutorial_3/src/hello.h根目录的 CMakeLists.txtsrc 目录的 CMakeLists.txthello.cpp 和 hello.h构建过程总结 tutorial_3/CMakeLists.txt cmake_minimum_required(V…

Latex + Overleaf 论文写作新手笔记

.tex 文件main.tex 文件 Latex 的文档层次结构不同文档类型的层次结构report 6 层结构实例article 5 层结构实例 Latex 语法图表插入与引用使用 figure 环境来插入图片使用 ref 命令来引用已有的图表格的插入与引用 代码块列表无序列表 itemize有序列表 enumerate 学位论文项目…