【经典算法】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版本
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语言版本
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版本
python 复制代码
def romanToInt(s):
    romanValues = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
    result = 0
    prevValue = 0
    for c in reversed(s):
        currentValue = romanValues[c]
        if currentValue < prevValue:
            result -= currentValue
        else:
            result += currentValue
        prevValue = currentValue
    return result
Go版本
go 复制代码
#### Go版本

```go
package main

import (
	"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 := 0
	prevValue := 0
	for _, 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、大数据、数据结构算法(公众号同名),回复暗号,更能获取学习秘籍和书籍等

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

相关推荐
wrx繁星点点6 分钟前
事务的四大特性(ACID)
java·开发语言·数据库
IT学长编程13 分钟前
计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·音乐系统·计算机毕业设计选题
IT学长编程30 分钟前
计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·毕业论文·协同过滤算法·计算机毕业设计选题·个性化音乐推荐系统
希望有朝一日能如愿以偿32 分钟前
力扣题解(飞机座位分配概率)
算法·leetcode·职场和发展
小小娥子35 分钟前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
Espresso Macchiato40 分钟前
Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II
leetcode·滑动窗口·leetcode medium·leetcode 3306·leetcode周赛417
几何心凉43 分钟前
已解决:org.springframework.web.HttpMediaTypeNotAcceptableException
java
丶Darling.43 分钟前
代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树
开发语言·数据结构·c++·笔记·学习·算法
华农第一蒟蒻1 小时前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
两点王爷1 小时前
使用WebClient 快速发起请求(不使用WebClientUtils工具类)
java·网络