linRichielinRichie
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
    • Python学习指南
  • 快速开始

    • Python: 输入与输出 (I/O)
    • Python: 异常处理 try-except
    • Python: List深入概述
    • Python: 面向对象编程(OOP)
  • Python 语法库函数

    • 语法库目录
    • 库

      • library目录
      • argparse:解析命令行参数
      • difflib:比较序列并生成差异信息
      • dnspython: DNS处理库
      • IPy:IP地址处理库
      • logging:记录和管理日志信息
      • os:访问和操作操作系统
      • psutil:系统性能信息库
      • re:正则表达式库
      • smtplib:邮件发送库
    • 函数

      • function目录
      • any() 函数
      • input 函数
      • lambda 和 map 函数
      • reversed()函数
      • zip()函数
    • 语句

      • statement目录
      • import 语句
      • Try/Exception 异常
    • 概念

      • concept目录
      • 深拷贝与浅拷贝
      • 列表、字典与元组
      • 文件读写
      • IO: 输入与输出
      • 逻辑判断与条件语句
      • OOP 面向对象:class
      • OOP: 面向对象编程
  • SQLAlchemy

    • 获取insert或者update的id
  • Pandas

    • Pandas目录
    • Pandas:基础操作
    • Pandas:数据处理与转换
    • Pandas: 数据写入 excel 表格
  • Python前端框架

    • Flask

      • 1. Flask简介
      • 2. Flask程序基本结构
      • 3. Flask请求-响应循环
      • 4. flask案例: 框架网页查询IP
      • Python: Flask中的GitHub OAuth
    • Django

      • chapter-01:Django框架认识

        • 1.1 Django的产生背景
        • 1.2 MTV设计模式
        • 1.3 Django 主要功能模块
      • chapter-02:开发环境配置

        • 2.1 Python的安装与配置
        • 2.2 虚拟环境安装与配置
        • 2.3 Django安装与配置
        • 2.4 MySQL安装配置
      • chapter-03:项目框架搭建

        • 3.1 Django管理工具-创建项目骨架
        • 3.2 修改项目的默认配置
        • 3.3 初始化项目环境
      • chapter-04:ORM应用与原理剖析

        • 4.1 构建POST应用需要的数据集
        • 4.2 Model相关的概念和使用方法
        • 4.3 Model的查询操作API
        • 4.4 ORM实现原理
      • chapter-05:Django管理后台

        • 5.1 将Model注册到管理后台
        • 5.2 管理后台实现原理
      • chapter-06:视图

        • 6.1 视图基础
        • 6.2 视图的高级特性和快捷方法
        • 6.3 基于类的通用视图
      • chapter-07:模板系统

        • 7.1 模板系统基础
        • 7.2 模板语言
      • chapter-08:表单系统

        • 8.2 使用表单系统实现表单: ModelForm
      • chapter-09:用户认证系统

        • 9.1 用户与身份认证
        • 9.2 权限管理
        • 9.3 用户认证系统应用
      • chapter-10:Django路由系统

        • 10.1 路由系统基础
      • chapter-11:Django中间件

        • 11.1 中间件基础
  • Python例子

    • Python: Linux的Shell命令
    • Python: PEP8自动格式化代码
    • Python: pip操作
    • Python: 业务服务监控
    • Python: 从文件逐行读取数据
    • 将链表转换为字符串
    • Python: 检查URL是否能正常访问
    • Python: 爬取网易云音乐
    • Python: 读取目录下的所有内容
    • 案例研究:文本统计
  • Python爬虫

    • 数据解析工具:Xpath
  • 算法题

    • 02:两数相加
    • 09:回文数
    • 13:罗马数值转换为整数
    • 14:最长公共前缀

13:罗马数值转换为整数

  • 题目描述
    • 字符对应关系
    • 特殊规则
    • 示例
    • 提示
  • 解题思路
  • 代码
    • 方法 1
    • 方法 2
    • 方法 3
  • 方法比较

题目描述

题目:

罗马数字包含以下七种字符: I、V、X、L、C、D 和 M。给定一个罗马数字,将其转换成整数。

字符对应关系

字符数值
I1
V5
X10
L50
C100
D500
M1000

特殊规则

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如:

  • IV 表示 4(5 - 1)
  • IX 表示 9(10 - 1)
  • XL 表示 40(50 - 10)
  • XC 表示 90(100 - 10)
  • CD 表示 400(500 - 100)
  • CM 表示 900(1000 - 100)

示例

示例 1:

输入: s = "III"
输出: 3
解释: III = 3

示例 2:

输入: s = "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3

提示

  • 1 <= s.length <= 15
  • s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
  • 题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内

解题思路

  1. 建立罗马数字到整数的映射关系
  2. 从左到右遍历字符串
  3. 根据规则判断是加还是减:
    • 如果当前字符代表的值小于其右边字符代表的值,则减去当前值
    • 否则加上当前值

代码

方法 1

从左向右遍历,通过比较相邻字符来决定加减:

class Solution:
    def romanToInt(self, s: str) -> int:
        # 建立罗马数字到整数的映射
        roman = {'I': 1, 'V': 5, 'X': 10, 'L': 50,
                 'C': 100, 'D': 500, 'M': 1000}
        result = 0  # 存储最终结果

        # 遍历到倒数第二个字符
        for index in range(len(s)-1):
            if roman[s[index]] < roman[s[index+1]]:
                result -= roman[s[index]]  # 当前字符小于右边字符,减去当前值
            else:
                result += roman[s[index]]  # 当前字符大于等于右边字符,加上当前值

        return result + roman[s[-1]]  # 加上最后一个字符的值

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串的长度
  • 空间复杂度:O(1),只需要常数空间存储映射关系

方法 2

从右向左遍历,通过与前一个值比较来决定加减:

class Solution:
    def romanToInt(self, s: str) -> int:
        # 定义罗马数字的映射
        roman = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        
        total = 0
        prev_value = 0

        for ch in reversed(s):
            value = roman[ch]
            if value < prev_value:
                total -= value  # 如果当前值小于前一个值,则减去当前值
            else:
                total += value  # 否则,加上当前值
            prev_value = value

        return total

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

方法 3

直接遍历,通过检查下一个字符来决定加减:

class Solution:
    def romanToInt(self, s: str) -> int:
        roman = {'I': 1, 'V': 5, 'X': 10, 'L': 50,
                'C': 100, 'D': 500, 'M': 1000}
        total = 0
        i = 0
        while i < len(s):
            # 获取当前字符代表的值
            value = roman[s[i]]
            # 如果不是最后一个字符,并且当前字符代表的值小于下一个字符代表的值
            if i + 1 < len(s) and value < roman[s[i + 1]]:
                total -= value
            else:
                total += value
            i += 1
        return total

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

方法比较

  1. 方法一:适合从左到右的线性处理
  2. 方法二:通过反向遍历简化了判断逻辑
  3. 方法三:直观但需要额外的边界检查

注意:

  • 确保输入是有效的罗马数字
  • 注意特殊组合的处理
  • 考虑边界情况

函数 reversed:reversed()指南

最近更新时间:
Prev
09:回文数
Next
14:最长公共前缀