leetcode13 罗马数字转整数

题目描述:罗马数字由七种字符组成,分别为 I、V、X、L、C、D 和 M,对应的数值分别为 1、5、10、50、100、500 和 1000。在一般情况下,小的数字位于大的数字右边,但有特殊情况,如 IV 表示 4,IX 表示 9,XL 表示 40,XC 表示 90,CD 表示 400,CM 表示 900。给定一个罗马数字,需要将其转换成整数。

例如:罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

 方法1 模拟

该方法的思想类似于“对号入座”,找到什么罗马符号对应的什么值就写进去,但是最关键的是要搞清楚前后的加减关系,以Roman=“MCMXCIV”为例,第二个位置上的C所对应的值要比第三个位置上的M所对应的值要小,关于前后是进行加法运算还是减法运算,可以看下图的图解,通过图解就可以清楚的知道该如何进行运算。 

 python完整代码:

class Solution:symbol_values = {"I": 1,"V": 5,"X": 10,"L": 50,"C": 100,"D": 500,"M": 1000}def romanToInt(self, str):digital = 0  # 定义当前数字n = len(str)  # 罗马字数字长度for i, ch in enumerate(str):value = Solution.symbol_values[ch]if i < n - 1 and value < Solution.symbol_values[str[i + 1]]:digital -= value  # 左边比右边小--->减else:digital += value  # 左边比右边大--->加return digital# 设置罗马数字
Roman = "MCMXCIV"
solution = Solution()
result = solution.romanToInt(Roman)
print("罗马数字转整数的结果为: ", result)

c++完整代码: 

#include<iostream>
#include<unordered_map>
using namespace  std;class Solution{
private:unordered_map<char, int> symbol_values ={{'I', 1},{'V', 5},{'X', 10},{'L', 50},{'C', 100},{'D', 500},{'M', 1000}};
public:int romanToInt(string str){int digital = 0;int n = str.length();for(int i = 0;i < n;++i){int value = symbol_values[str[i]];if(i < n - 1 && value < symbol_values[str[i + 1]]){digital -= value;} else{digital += value;}}return digital;}
};int main(){string Roman = {"MCMXCIV"};Solution solution;int result = solution.romanToInt(Roman);cout << Roman << " into roman digital " << result << endl;// 输出转换结果return 0;
}

java完整代码: 

import java.util.HashMap;public class RomanToInt {HashMap<Character, Integer> symbolValues = new HashMap<Character, Integer>() {{put('I', 1);put('V', 5);put('X', 10);put('L', 50);put('C', 100);put('D', 500);put('M', 1000);}};public int romanToInt(String str) {int digital = 0;int n = str.length();for (int i = 0; i < n; ++i) {int value = this.symbolValues.get(str.charAt(i));if (i < n - 1 && value < this.symbolValues.get(str.charAt(i + 1))) {digital -= value;} else {digital += value;}}return digital;}public static void main(String[] args) {// 创建 RomanToInt 类的实例RomanToInt converter = new RomanToInt();// 设置当前罗马数字String Roman = "MCMXCIV";// 调用方法将罗马数字转换为整数int result = converter.romanToInt(Roman);// 输出转换结果System.out.println("罗马数字转整数为: " + result);}
}

 方法2 贪心哈希表

该方法其实和上面的方法差不多,也是逐一逐二的遍历哈希表中存储的罗马字符,在根据所对应的值生成我们想要的整数,其中关键的还是怎样分清楚什么时候加,什么时候进行减。

 python完整代码:

class Solution:def romanToInt(self, str):  # 添加 self 参数roman_dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}  # 哈希表digital = 0  # 整数结果for i in range(len(str)):  # 遍历每个字符# 如果当前字符比下一个字符小,则减去当前字符的值if i < len(str) - 1 and roman_dict[str[i]] < roman_dict[str[i + 1]]:digital -= roman_dict[str[i]]  # 当前字符比下一个字符小--->减else:digital += roman_dict[str[i]]  # 当前字符比下一个字符大--->加return digital# 示例
Roman = "MCMXCIV"
solution = Solution()
integer_value = solution.romanToInt(Roman)
print(f"罗马数字 {Roman} 转换为整数为: {integer_value}")

c++完整代码:

#include <iostream>
#include <unordered_map>
using namespace std;class Solution {
public:int romanToInt(string str) {unordered_map<char, int> roman_dict = {{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}};int digital = 0;for (int i = 0; i < str.length(); ++i) {// 如果当前字符比下一个字符小,则减去当前字符的值if (i < str.length() - 1 && roman_dict[str[i]] < roman_dict[str[i + 1]]) {digital -= roman_dict[str[i]];  //当前字符比下一个字符小--->减} else {digital += roman_dict[str[i]]; //当前字符比下一个字符大--->加}}return digital;}
};int main() {Solution solution;string Roman = "MCMXCIV";int integer_value = solution.romanToInt(Roman);cout << "Roman digital " << Roman << " into int: " << integer_value << endl;return 0;
}

 java完整代码:

import java.util.HashMap;
public class RomanToInt1 {public int romanToInt(String str) {HashMap<Character, Integer> romanDict = new HashMap<>();romanDict.put('I', 1);romanDict.put('V', 5);romanDict.put('X', 10);romanDict.put('L', 50);romanDict.put('C', 100);romanDict.put('D', 500);romanDict.put('M', 1000);int digital = 0;for (int i = 0; i < str.length(); ++i) {// 如果当前字符比下一个字符小,则减去当前字符的值// 在Java中,charAt 是一个用于获取字符串中指定位置字符的方法。它是String类的一个成员方法// 语法为char charAt(int index) // 其中,index 是字符串中字符的索引,从0开始计数。返回值是指定索引位置的字符if (i < str.length() - 1 && romanDict.get(str.charAt(i)) < romanDict.get(str.charAt(i + 1))) {digital -= romanDict.get(str.charAt(i));} else {digital += romanDict.get(str.charAt(i));}}return digital;}public static void main(String[] args) {RomanToInt1 solution = new RomanToInt1();String roman = "MCMXCIV";int integerValue = solution.romanToInt(roman);System.out.println("罗马数字 " + roman + " 转换为整数为: " + integerValue);}
}

 方法3 if-else方法

if-else方法的思路很简答,主要思想就是从罗马数字的最右边往左遍历,假如输入的都是图(a)中的罗马数字,那么我们根本不用费什么劲,直接划拉一遍,直接M对应1000,I对应1等等等等,然后把得到的对应的整数加一块就皆大欢喜了,但是最重要的问题是输入的罗马数字会出现图(b)所示的情况,那么怎么解决这种情况呢?方法很简单,我们图(a)中所对应的罗马数字的情况中再加上图(b)这种情况,也就是在当前位置再往前一位进行比较,如果出现图(b)的情况时,再补充上,最后全部遍历完后,把所有数字加一块就功成身退了。

  c++完整代码: 

// -*- coding: utf-8 -*-
// @Time    : 2024/1/4 10:28
// @Author  : 长沙有肥鱼
// @FileName: 罗马数字转整数_if.cpp
// @Software: CLion
// @Blog    : https://blog.csdn.net/weixin_53660567?spm=1010.2135.3001.5343#include <iostream>
using namespace std;class Solution {
public:int romanToInt(std::string str) {int len = str.length();int digital = 0;for (int i = len - 1; i >= 0; i--) {  //从右往左边遍历if (str[i] == 'V') {if (i - 1 >= 0 && str[i - 1] == 'I') {//当V左边的罗马数字为I时 digital--->+4//当V左边的罗马数字不为I时 digital--->+5 因为除I以外的罗马数字都比它大digital += 4;i--;continue;} else {digital += 5;continue;}}if (str[i] == 'X') {//当X左边的罗马数字为X时 digital--->+9//当X左边的罗马数字不为I时 digital--->+10if (i - 1 >= 0 && str[i - 1] == 'I') {digital += 9;i--;continue;} else {digital += 10;continue;}}if (str[i] == 'L') {if (i - 1 >= 0 && str[i - 1] == 'X') {//当L左边的罗马数字为X时 digital--->+40//当L左边的罗马数字不为X时 digital--->+50digital += 40;i--;continue;} else {digital += 50;continue;}}if (str[i] == 'C') {if (i - 1 >= 0 && str[i - 1] == 'X') {//当C左边的罗马数字为X时 digital--->+90//当C左边的罗马数字不为X时 digital--->+100digital += 90;i--;continue;} else {digital += 100;continue;}}if (str[i] == 'D') {if (i - 1 >= 0 && str[i - 1] == 'C') {//当D左边的罗马数字为C时 digital--->+400//当D左边的罗马数字不为C时 digital--->+500digital += 400;i--;continue;} else {digital += 500;continue;}}if (str[i] == 'M') {if (i - 1 >= 0 && str[i - 1] == 'C') {//当M左边的罗马数字为C时 digital--->+900//当M左边的罗马数字不为C时 digital--->+1000digital += 900;i--;continue;} else {digital += 1000;continue;}}if (str[i] == 'I') {//当L左边的罗马数字为I时 digital--->+1digital++;}}return digital;}
};int main() {Solution solution;std::string roman = "MCMXCIV";int integerValue = solution.romanToInt(roman);std::cout << "Roman digital " << roman << " into int:  " << integerValue << std::endl;return 0;
}

python完整代码: 

# -*- coding: utf-8 -*-
# @Time    : 2024/1/4 10:22
# @Author  : 长沙有肥鱼
# @FileName: 罗马数字转整数_if_else.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/weixin_53660567?spm=1010.2135.3001.5343
class Solution:def romanToInt(self, str):length = len(str)digital = 0i = length - 1while i >= 0:if str[i] == 'V':if i - 1 >= 0 and str[i - 1] == 'I':digital += 4i -= 1else:digital += 5i -= 1elif str[i] == 'X':if i - 1 >= 0 and str[i - 1] == 'I':digital += 9i -= 1else:digital += 10i -= 1elif str[i] == 'L':if i - 1 >= 0 and str[i - 1] == 'X':digital += 40i -= 1else:digital += 50i -= 1elif str[i] == 'C':if i - 1 >= 0 and str[i - 1] == 'X':digital += 90i -= 1else:digital += 100i -= 1elif str[i] == 'D':if i - 1 >= 0 and str[i - 1] == 'C':digital += 400i -= 1else:digital += 500i -= 1elif str[i] == 'M':if i - 1 >= 0 and str[i - 1] == 'C':digital += 900i -= 1else:digital += 1000i -= 1elif str[i] == 'I':digital += 1return digital# 示例
solution = Solution()
roman_numeral = "MCMXCIV"
integer_value = solution.romanToInt(roman_numeral)
print(f"罗马数字 {roman_numeral} 转换为整数为: {integer_value}")

Java完整代码: 

public class RomanToInt2 {public int romanToInt(String str) {int len = str.length();int digital = 0;// 如果当前字符比下一个字符小,则减去当前字符的值// 在Java中,charAt 是一个用于获取字符串中指定位置字符的方法。它是String类的一个成员方法// 语法为char charAt(int index)// 其中,index 是字符串中字符的索引,从0开始计数。返回值是指定索引位置的字符for(int i = len - 1; i >= 0; i--) {if(str.charAt(i) == 'V') {if((i - 1 >= 0) && (str.charAt(i - 1) == 'I')){digital += 4;i--;continue;}else {digital+=5;continue;}}if(str.charAt(i) == 'X') {if((i - 1 >= 0) && (str.charAt(i - 1) == 'I')){digital += 9;i--;continue;}else {digital += 10;continue;}}if(str.charAt(i) == 'L') {if((i - 1 >= 0) && (str.charAt(i - 1) == 'X')){digital += 40;i--;continue;}else {digital += 50;continue;}}if(str.charAt(i) == 'C') {if((i - 1 >= 0) && (str.charAt(i - 1) == 'X')){digital += 90;i--;continue;}else {digital += 100;continue;}}if(str.charAt(i) == 'D') {if((i - 1 >= 0) && (str.charAt(i - 1) == 'C')){digital += 400;i--;continue;}else {digital += 500;continue;}}if(str.charAt(i) == 'M') {if((i - 1 >= 0) && (str.charAt(i - 1) == 'C')){digital += 900;i--;continue;}else {digital += 1000;continue;}}if(str.charAt(i) == 'I') {digital++;}}return digital;}public static void main(String[] args) {RomanToInt2 solution = new RomanToInt2();String roman = "MCMXCIV";int integerValue = solution.romanToInt(roman);System.out.println("罗马数字 " + roman + " 转换为整数为: " + integerValue);}
}

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

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

相关文章

单线圈无刷直流电机驱动芯片选型分析,可应用于笔记本,显卡风散热风扇,变频冷却风扇,打印机风扇等产品上

单线圈无刷直流电机的电机驱动器。 GC1298R/S&#xff0c;GC1262E/S&#xff0c;GC1298R/S&#xff0c;GC1262R/S具有高效的直接PWM控制方式&#xff0c;它可以控制无刷直流电机转速。它集成了最低速度限制模式、可调速度斜率控制模式、软启动模式、风扇转速计、锁保护、自动重…

《剑指offer》数学第一题:数值的整数次方

题目描述&#xff1a; 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路&#xff1a; 给定一个浮点数求它的整数次方。要考虑到所有的情况&#xff0c;关于指数&#xff0c;如果是0&#xff0c;则结果是1&#xff1b; 指数是1&#xff0c…

CNN——AlexNet

1.AlexNet概述 论文原文&#xff1a;ImageNet Classification with Deep Convolutional Neural Networks 在LeNet提出后&#xff0c;卷积神经网络在计算机视觉和机器学习领域中很有名气。但卷积神经网络并没有主导这些领域。这是因为虽然LeNet在小数据集上取得了很好的效果&am…

C#: Label、TextBox 鼠标停留时显示提示信息

说明&#xff1a;记录在 Label、TextBox 控件上 鼠标停留时显示提示信息的方法。 1.效果图 2.具体实现步骤 1. 在Form 窗口中先创建 Label 并取名&#xff1a;KEY_label &#xff0c;或 TextBox 取名&#xff1a;KEY_textBox 在 Form1 函数中添加初始化代码&#xff0c;如下&…

ssm基于web的素材网的设计与实现+vue论文

基于web的素材网站的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。传统的素材信息管理模式&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的管理…

C#中使用 async await TaskCompletionSource<T>实现异步逻辑同步写

Task、async 和 await 是 C# 中用于处理异步编程的关键概念。它们一起构成了异步编程的基础。 Task Task 是表示异步操作的抽象&#xff0c;它属于 System.Threading.Tasks 命名空间。Task 可以表示已经完成的任务、正在运行的任务或者尚未开始的任务。通过 Task&#xff0c;…

你的第一个C/S程序

目录 socket服务端代码客户端代码执行结果 socket socket基础知识 服务端代码 import socket import threading import timeMSG_LENGTH 64 DISCONNECTED !CONNECTION CLOSED connections 0#定义服务器地址 server_ip socket.gethostbyname(socket.gethostname()) server…

【设计模式之美】面向对象分析方法论与实现(二):需求到接口实现的方法论

文章目录 一. 进行面向对象设计1. 划分职责>需要有哪些类2. 定义类及其属性和方法3. 定义类与类之间的交互关系4. 将类组装起来并提供执行入口 二. 如何进行面向对象编程&#xff1f;1. 接口实现2. 辩证思考与灵活应用 【设计模式之美】面向对象分析方法论与实现&#xff08…

教育场景数字化中音视频小程序的发展

教育场景数字化逐步成为刚需 2018年以来&#xff0c;国家对在线教育行业的监管收紧&#xff0c;以及受益于 5G 技术的发展&#xff0c;教育科技逐步走向成熟化和规范化。 教育行业的本质是人与人&#xff08;老师与学生、老师与家长&#xff0c;以及更多角色直接的沟通与互动…

【数据结构和算法】小行星碰撞

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 什么情况会用到栈 2.2 方法一&#xff1a;模拟 栈 三、代码 3.1 方法一&#xff1a;模拟 栈 四…

【LLM+RS】LLM在推荐系统的实践应用(华为诺亚)

note LLM用于推荐主要还是解决推荐系统加入open domain 的知识。可以基于具体推荐场景数据做SFT。学习华为诺亚-技术分享-LLM在推荐系统的实践应用。 文章目录 note一、背景和问题二、推荐系统中哪里使用LLM1. 特征工程2. 特征编码3. 打分排序 三、推荐系统中如何使用LLM四、挑…

共享WiFi贴项目加盟可以解决商家哪些痛点?

近年来&#xff0c;共享WiFi贴项目在共享商业领域引起了广泛关注。作为一种便捷的网络分享工具&#xff0c;共享WiFi贴不仅受到很多人的青睐&#xff0c;更能够为商家带来诸多实际利益。那么&#xff0c;共享WiFi贴项目加盟究竟可以解决商家哪些痛点呢&#xff1f; 共享WiFi贴为…

【C#】知识点实践序列之Lock的锁定代码块

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂之知识点实践序列》文章。 2024年第1篇文章&#xff0c;此篇文章是C#知识点实践序列之Lock知识点&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 本篇验证Lock锁定代…

Navicat(数据库可视化软件)安装教程以及连接MYSQL

Navicat安装教程以及连接MYSQL Navicat&#xff08;数据库可视化软件&#xff09;安装流程安装MySQLnavicat连接mysql数据库 Navicat&#xff08;数据库可视化软件&#xff09; Navicat 是一款专门为 MySQL 设计的可视化数据库 GUI 管理工具&#xff0c;我们可以在自己的计算机…

深入浅出Python日志打印

0.引言 在编程过程中&#xff0c;日志记录是一项非常重要的任务&#xff0c;无论是用于调试代码、记录系统运行状态&#xff0c;还是跟踪可能出现的问题&#xff0c;日志都能发挥重要作用。然而&#xff0c;许多开发者习惯使用简单的print语句来记录信息&#xff0c;这种方法虽…

ensp vlan连接(详细)

1.将需要的设备放置好 2.将设备连接起来 3.启动所有设备 4.备注好每台PC机的信息 5.配置好每台PC机 6.配置交换机1 进入配置视图&#xff0c;关闭信息提示 重命名设备 批量创建VLAN 开始配置接口 更改接口类型为ACCESS 将接口划分到对应的VLANN 配置下一个接口&#xff0c;步…

编译 nccl-tests 项目

1&#xff0c;编译 下载源代码 git clone --recursive https://github.com/NVIDIA/nccl-tests.git 编译源代码 cd nccl-tests/ make -j 2&#xff0c;运行 cd ./build/ ./all_reduce_perf --help ./all_reduce_perf -b 8 -e 256M -f 2 -g 4 效果图&#xff1a; 3&#…

说说产品经理能力模型

产品经理的能力模型应该是什么样的&#xff0c;可能100个产品人会有100种看法&#xff0c;每个人的认知都是不一样的&#xff0c;今天和大家分享下我对产品经理能力模型的总结。 前段时间&#xff0c;一个30多岁做前端开发的朋友跟我说想转行做产品&#xff0c;让我帮忙指导下…

关于Python里xlwings库对Excel表格的操作(三十)

这篇小笔记主要记录如何【如何使用“Chart类”、“Api类"和“Axes函数”为新图表设置标题文本内容、字体、字号、粗细、正斜、颜色、坐标轴主要网格线】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】…

Maple 各版本安装指南

Maple 下载链接 https://pan.baidu.com/s/11hKo1XxZGa0xv3Ivj6fbEA?pwd0531 1.鼠标右击【Maple 2023】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Maple 2023】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup】选择【以管理员身…