【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)

本文主要是介绍【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 作者主页: 🔗进朱者赤的博客

  • 精选专栏:🔗经典算法

  • 作者简介:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名

  • ❤️觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论,💬支持博主,记得点个大大的关注,持续更新🤞
    ————————————————-

罗马数字转整数

  • 标签(题目类型):字符串处理、数学计算

题目描述

给定一个罗马数字字符串,将其转换成整数。输入确保在 1 到 3999 的范围内。

罗马数字由以下七个符号表示:I, V, X, L, C, D 和 M。这些符号对应的值分别是 1, 5, 10, 50, 100, 500 和 1000。例如,罗马数字 III 表示 3,IV 表示 4,IX 表示 9,LVIII 表示 58,如此类推。

注意,罗马数字的书写规则遵循从左到右的减法原则,例如 IV 表示 4,IX 表示 9,即从较大的数字中减去较小的数字来表示相应的数。但是也有特殊情况,例如 IV = V - I = 5 - 1 = 4,IX = X - I = 10 - 1 = 9,XL = L - X = 50 - 10 = 40,XC = C - X = 100 - 10 = 90,CD = D - C = 500 - 100 = 400,CM = M - C = 1000 - 100 = 900。

为了简化问题,我们只需要考虑这些基本的减法情况。

思路及实现

方式一:直接映射法

思路

  • 创建一个映射表,将罗马数字的每个字符映射到其对应的整数值。
  • 遍历输入的罗马数字字符串,对每个字符进行查找和转换。
  • 对于特殊的减法情况,例如 IV, IX, XL, XC, CD, CM,需要进行额外的判断和处理。
Java版本
public class RomanToInt {public int romanToInt(String s) {Map<Character, Integer> romanValues = new HashMap<>();romanValues.put('I', 1);romanValues.put('V', 5);romanValues.put('X', 10);romanValues.put('L', 50);romanValues.put('C', 100);romanValues.put('D', 500);romanValues.put('M', 1000);int result = 0;int prevValue = 0;for (int i = s.length() - 1; i >= 0; i--) {int currentValue = romanValues.get(s.charAt(i));if (currentValue < prevValue) {result -= currentValue;} else {result += currentValue;}prevValue = currentValue;}return result;}
}
C语言版本
#include <stdio.h>
#include <string.h>int romanToInt(char * s){int romanValues[256] = {0};romanValues['I'] = 1;romanValues['V'] = 5;romanValues['X'] = 10;romanValues['L'] = 50;romanValues['C'] = 100;romanValues['D'] = 500;romanValues['M'] = 1000;int result = 0;int prevValue = 0;int length = strlen(s);for (int i = length - 1; i >= 0; i--) {int currentValue = romanValues[s[i]];if (currentValue < prevValue) {result -= currentValue;} else {result += currentValue;}prevValue = currentValue;}return result;
}
Python3版本
def romanToInt(s):romanValues = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}result = 0prevValue = 0for c in reversed(s):currentValue = romanValues[c]if currentValue < prevValue:result -= currentValueelse:result += currentValueprevValue = currentValuereturn result
Go版本
#### Go版本```go
package mainimport ("fmt""strings"
)func romanToInt(s string) int {romanValues := map[rune]int{'I': 1,'V': 5,'X': 10,'L': 50,'C': 100,'D': 500,'M': 1000,}result := 0prevValue := 0for _, ch := range strings.ToRuneSlice(s) {currentValue := romanValues[ch]if currentValue < prevValue {result -= currentValue} else {result += currentValue}prevValue = currentValue}return result
}func main() {romanString := "MCMXCIV"integer := romanToInt(romanString)fmt.Printf("The integer representation of %s is %d\n", romanString, integer)
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是罗马数字字符串的长度。我们只需要遍历一次字符串即可得到结果。
  • 空间复杂度:O(1),因为我们使用了常量空间来存储罗马数字对应的整数值。尽管在 Python 和 Go 中使用了哈希表,但哈希表的大小是固定的,与输入字符串的长度无关,因此空间复杂度可以认为是 O(1)。

总结

方式优点缺点时间复杂度空间复杂度
方式一实现简单、直接,效率高需要额外处理减法情况O(n)O(1)

相似题目

相似题目难度链接
LeetCode 12. 整数转罗马数字中等LeetCode-12
LeetCode 415. 字符串相加简单LeetCode-415
LeetCode 67. 二进制求和简单LeetCode-67

欢迎一键三连(关注+点赞+收藏),技术的路上一起加油!!!代码改变世界

  • 关于我:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名),回复暗号,更能获取学习秘籍和书籍等

  • —⬇️欢迎关注下面的公众号:进朱者赤,认识不一样的技术人。⬇️—

这篇关于【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073462

相关文章

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque