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时
                    break
        return "".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时
                    break
        return "".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);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络【Cookie和session机制】

会话&#xff08;Session&#xff09;跟踪是Web程序中常用的技术&#xff0c;用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份&#xff0c;Session通过在服务器端记录信息确定用户身份。 本章将系统地讲述Cookie与Sess…

数据挖掘中的数据属性特点、描述性统计度量与相似度计算

目录 1. 引言 2. 数据挖掘中的数据属性 2.1 数值属性 2.2 标称属性 2.3 有序属性 2.4 无序属性 3. 描述性统计度量 3.1 中心趋势度量 3.2 离散程度度量 3.3 分布形状度量 4. 相似度计算 4.1 欧氏距离 4.2 余弦相似度 4.3 Jaccard 5. 数据挖掘中的案例应用 5.1 …

Python open函数详解:打开指定文件与 readline和readlines函数:按行读取文件

Python open函数详解&#xff1a;打开指定文件 掌握了各种操作目录字符串或目录的函数之后&#xff0c;接下来可以准备读写文件了。在进行文件读写之前&#xff0c;首先要打开文件。 Python 提供了一个内置的 open() 函数&#xff0c;该函数用于打开指定文件。 open() 函数的…

团子杂记:SAP PS or 项目管理软件(PMIS )? PPM/P6

众所周知SAP的PS模块在项目型企业的SAP应用中扮演着核心角色&#xff0c;整个项目端到端的业务执行、财务核算、控制及分析都是通过PS作为主线&#xff0c;依赖于PS中的项目对象&#xff08;如WBS元素、网络活动等&#xff09;实现的。 在实施SAP的过程中&#xff0c;可以看到…

实战环境搭建-安装Linux

打开VMware如下图: 点击“创建新的虚拟机”如下图: 选择自定义(高级选项),点击“下一步”,如下图: 点击“下一步” 点击“浏览”选择下载好的镜像文件,如下图:

arduino ESP32 002 wokwi在线仿真点亮小灯

wokwi 点亮小灯 ESP-IDF #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h"#define PIN_LED_1 GPIO_NUM_16void setup() {// 设置LED引脚为输出gpio_reset_pin(PIN_LED_1);// esp…

在mac上怎么方便的编辑xml文件

在Mac上 XML 文件不能默认以较直观的方式在“文本编辑”中打开&#xff0c;如果已安装 Xcode&#xff0c;你可以使用 Xcode 打开 XML 文件。在 Xcode 中&#xff0c;XML 文件通常会以可视化的方式显示&#xff0c;使得编辑更加直观&#xff0c;但是如果你不想安装 XCode&#x…

项目引入Jar包的几种方式

目录 背景 方式一 前提 创建一个jar包 使用 方式二 背景 通常情况下&#xff0c;使用SpringBoot框架开发项目的过程中&#xff0c;需要引入一系列依赖&#xff0c;首选的就是在项目的 pom.xml 文件里面通过Maven坐标进行引入&#xff08;可以通过Maven的坐标引入jar包的前…

[C#]C# OpenVINO部署yolov8实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 抛弃了前几代模型的 Anchor-Base。 YOLO 是一种基于图像全局信息进行预测的目标检测系统。自 2015 年 Joseph Redmon、Ali Farhadi 等人提出初代模型以来&#xff0c;领域内的研究者们…

HarmonyOS-ArkTS基本语法及声明式UI描述

初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在学习ArkTS语言之前&#xff0c;建议开发者具备TS语…

基于springboot的火锅店管理系统设计与实现

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1选题动因 当前…

LeetCode 2807. 在链表中插入最大公约数

给你一个链表的头 head &#xff0c;每个结点包含一个整数值。 在相邻结点之间&#xff0c;请你插入一个新的结点&#xff0c;结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。 两个数的 最大公约数 是可以被两个数字整除的最大正整数。 示例 1&#xf…

每周一算法:倍增法查找位置

倍增法 倍增法&#xff08;Binary Lifting&#xff09;&#xff0c;顾名思义&#xff0c;就是利用“以翻倍的速度增长”的思想来解决问题的一类算法。 下面介绍如何使用倍增法在有序的序列中查找满足条件的位置。 题目描述 给定一个单调不降的序列&#xff0c;以及 m m m个…

三、C语言中的分支与循环—for循环 (6)

本章分支结构的学习内容如下&#xff1a; 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句&#xff08;4&#xff09;分支结构 完 本章循环结构的…

缓存和数据库,1+1如何大于2?

一、缓存的本质 缓存&#xff0c;简单说就是为了节约对原始资源重复获取的开销&#xff0c;而将结果数据副本存放起来以供获取的方式。 首先&#xff0c;缓存往往针对的是“资源”。我们前面已经多次提到过&#xff0c;当某一个操作是"幂等"的和“安全"的&#…

从传统到现代:知识服务如何被数字化工具重新定义

随着数字技术的快速发展&#xff0c;教育行业正在经历一场前所未有的变革。乔拓云作为知识产品与用户服务的数字化工具&#xff0c;以其卓越的技术实力和创新能力&#xff0c;引领着这场变革。 乔拓云开发的教育系统&#xff0c;为广大知识分享博主提供了一个全新的舞台。这个系…

【springboot实现CURD模版项目-Jesus】

springboot实现CURD模版项目-Jesus STEP 1 项目创建 1.1 新建Spring Initializr项目   1.2 选择需要的依赖 springboot有2.7.2直接选272STEP 2 配置更改 2.1更改maven配置   2.2 检查项目配置jdk、sdk、jre版本一致   2.3 检查pom文件&#xff0c;Maven-Reload project构…

数据库02-06 形式化

01. 03. 04. 05. 06. 07. 08. 09.

【Linux Shell】2. Shell 变量

文章目录 【 1. 变量命名规则 】【 2. 变量的使用 】【 3. 只读变量 】【 4. 删除变量 】【 5. 变量类型 】【 6. Shell 字符串 】6.1 字符串的分类6.2 字符串操作 【 7. Shell 数组 】7.1 定义数组7.2 读取数组7.3 获取数组的长度 【 8. Shell 注释 】8.1 单行注释8.2 多行注释…

『开发工具篇』- 配置 gradle 等相关依赖镜像源

『开发工具篇』- 配置 gradle 等相关依赖镜像源 1.更换gradle下载源2. 配置setting.gradlekts文件gradle文件 1.更换gradle下载源 使用腾讯云的镜像库https://mirrors.cloud.tencent.com/gradle/ gradle-x.x-all.zip&#xff1a;编译后的二进制发布版以及源码和文档gradle-x.…