当前位置: 首页 > article >正文

2025-4-4-python算法题(OD算法题-最长合法表达式)

文章目录

  • 几个常用库函数的使用
    • 1. `functools` 模块
    • 2. `sys` 模块
    • 3. `collections` 模块
    • 4. `copy` 模块
    • 5. `itertools` 模块
    • 6. `re` 模块
    • 7. `math` 模块
  • OD算法题-最长合法表达式
    • 学习python的内置函数 eval(expr)

几个常用库函数的使用

import functools
import sys
from collections import Counter, defaultdict
import copy
from itertools import permutations
import re
import math
import sys

1. functools 模块

functools 中的 reduce 函数可以对可迭代对象进行累积操作,lru_cache 可以缓存函数的返回值以避免重复计算。

import functools# 使用 reduce 计算阶乘
numbers = [1, 2, 3, 4, 5]
factorial = functools.reduce(lambda x, y: x * y, numbers)
print(f"5 的阶乘是: {factorial}")# 使用 lru_cache 缓存函数结果
@functools.lru_cache(maxsize=None)
def fibonacci(n):if n < 2:return nreturn fibonacci(n - 1) + fibonacci(n - 2)print(f"斐波那契数列第 10 项是: {fibonacci(10)}")

2. sys 模块

sys 可以获取命令行参数,还能控制程序的退出。

import sys# 获取命令行参数
if len(sys.argv) > 1:print(f"你传入的参数是: {sys.argv[1]}")
else:print("没有传入命令行参数。")# 退出程序
sys.exit(0)

3. collections 模块

  • Counter:统计可迭代对象中元素的出现次数。
from collections import Counterwords = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
word_count = Counter(words)
print("单词出现次数统计:", word_count)
  • defaultdict:当访问不存在的键时返回默认值。
from collections import defaultdict# 创建一个默认值为 0 的字典
fruit_prices = defaultdict(int)
fruit_prices['apple'] = 1.5
print("苹果的价格是:", fruit_prices['apple'])

4. copy 模块

copy 模块可以进行浅复制和深复制。

import copyoriginal_list = [[1, 2], [3, 4]]
# 浅复制
shallow_copy = copy.copy(original_list)
# 深复制
deep_copy = copy.deepcopy(original_list)# 修改原始列表
original_list[0][0] = 99print("浅复制后的列表:", shallow_copy)
print("深复制后的列表:", deep_copy)

5. itertools 模块

permutations 函数可以生成可迭代对象的所有排列组合。

from itertools import permutationsnumbers = [1, 2, 3]
perms = permutations(numbers)
print("数字 1, 2, 3 的所有排列组合:")
for perm in perms:print(perm)

6. re 模块

re 模块可以用于字符串的匹配和替换。

import retext = "Hello, my email is example@example.com. Contact me!"
# 查找邮件地址
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
emails = re.findall(email_pattern, text)
print("找到的邮件地址:", emails)# 替换文本中的单词
new_text = re.sub(r'Hello', 'Hi', text)
print("替换后的文本:", new_text)

7. math 模块

math 模块提供了许多数学函数。

import math# 计算平方根
sqrt_result = math.sqrt(25)
print("25 的平方根是:", sqrt_result)# 计算正弦值
sin_result = math.sin(math.radians(30))
print("30 度的正弦值是:", sin_result)

OD算法题-最长合法表达式

  提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值。如果没有,则返回 0 。
  简单数学表达式只能包含以下内容:
  0-9 数字,符号 ±
*

说明:
所有数字,计算结果都不超过 long
如果有多个长度一样的,请返回第一个表达式的结果
数学表达式,必须是最长的,合法的
操作符不能连续出现,如 ±-+1 是不合法的

import redef is_valid_expr(expr):# 检查操作符是否连续if re.search(r'[+\-*]{2,}', expr):return False# 表达式必须以数字开头和结尾if not re.match(r'^\d', expr) or not re.search(r'\d$', expr):return Falsereturn Truedef calculate_expr(expr):try:return eval(expr)except:return Nonedef longest_valid_expression(s):max_length = 0max_result = 0n = len(s)for start in range(n):for end in range(start + 1, n + 1):sub_expr = s[start:end]if is_valid_expr(sub_expr):result = calculate_expr(sub_expr)if result is not None and len(sub_expr) > max_length:max_length = len(sub_expr)max_result = resultreturn max_result# 示例测试
s = "a1+2b3*4"
print(longest_valid_expression(s))
  1. is_valid_expr 函数

    • 使用 re.search 检查表达式中是否存在连续的操作符([+\-*]{2,}),如果存在则表达式不合法。
    • 使用 re.matchre.search 分别检查表达式是否以数字开头(^\d)和结尾(\d$),不满足则不合法。
  2. calculate_expr 函数

    • 利用 eval 函数计算表达式的值,如果计算过程中出现异常(如语法错误等),返回 None
  3. longest_valid_expression 函数

    • 通过两层循环遍历字符串所有可能的子串。
    • 对每个子串,先调用 is_valid_expr 判断是否合法,若合法再用 calculate_expr 计算值。
    • 若计算结果有效且子串长度大于当前记录的最大长度,更新最大长度和结果。
  4. 最后通过示例字符串测试函数功能。

学习python的内置函数 eval(expr)

eval(expr) 是 Python 内置函数,功能强大且使用需谨慎。
eval() 函数能将字符串 expr 当成有效的 Python 表达式来执行,并返回表达式的计算结果 。例如:

result = eval("1 + 2 * 3")
print(result)  # 输出7

这里字符串 "1 + 2 * 3" 被当作数学表达式计算,返回运算结果 7

相关文章:

2025-4-4-python算法题(OD算法题-最长合法表达式)

文章目录 几个常用库函数的使用1. functools 模块2. sys 模块3. collections 模块4. copy 模块5. itertools 模块6. re 模块7. math 模块 OD算法题-最长合法表达式学习python的内置函数 eval(expr) 几个常用库函数的使用 import functools import sys from collections import…...

嵌入式——Linux系统的使用以及编程练习

目录 一、Linux的进程、线程概念 &#xff08;一&#xff09;命令控制进程 1、命令查看各进程的编号pid 2、命令终止一个进程pid 二、初识Linux系统的虚拟机内存管理 &#xff08;一&#xff09;虚拟机内存管理 &#xff08;二&#xff09;与STM32内存管理对比 三、Lin…...

(回滚莫队)洛谷 P10268 符卡对决 题解

居然还没调出来&#xff1f;感觉是数据类型的问题&#xff0c;真是吓人。先把思路写一下吧。 题意 灵梦一共有 n n n 张符卡&#xff0c;每张卡都有一个能力值&#xff0c;对于第 i i i 张卡&#xff0c;它的能力值为 a i a_i ai​&#xff0c;现在她想从中选出两张符卡并…...

在MacOS 10.15上使用MongoDB

这次是在MacOS 10.15上使用MongoDB。先在豆包问支持MacOS 10.15的MongoDB最新版是什么&#xff0c;答案是MongoDB 5.0。 抱着谨慎怀疑的态度去官方网站查询了一下&#xff0c;答案如下 MongoDB 7.x支持的最低版本MacOS是11MongoDB 6.x支持的最低版本MacOS是10.14 又找deepsee…...

思二勋:未来所有的业务都将生于AI、长于AI、成于AI

每个时代都有其标志性的技术&#xff0c;每个技术的产生或极大地解放了个体的劳动力&#xff0c;提高了个体与组织之间的协作效率&#xff0c;或极大地促进了生产效率或使用体验&#xff0c;或将极大地优化了资源配置和供需匹配效率&#xff0c;从而提高人们的生活水平。从青铜…...

混合专家模型(MoE):助力大模型实现高效计算

引言 近年来&#xff0c;大模型的参数规模不断攀升&#xff0c;如何在保证性能的前提下降低计算成本和显存消耗&#xff0c;成为业界关注的重点问题。混合专家模型&#xff08;Mixture of Experts, MoE&#xff09;应运而生&#xff0c;通过“分而治之”的设计理念&#xff0c…...

【学习笔记】计算机网络(七)—— 网络安全

第7章 网络安全 文章目录 第7章 网络安全7.1 网络安全问题概述7.1.1 计算机网络面临的安全性威胁7.1.2 安全的计算机网络7.1.3 数据加密模型 7.2 两类密码体制7.2.1 对称密钥密码体制7.2.2 公钥密码体制 7.3 鉴别7.3.1 报文鉴别7.3.2 实体鉴别 7.4 密钥分配7.4.1 对称密钥的分配…...

预测分析(四):面向预测分析的神经网络简介

文章目录 面向预测分析的神经网络简介神经网络模型1. 基本概念2. 前馈神经网络3. 常见激活函数4. 循环神经网络&#xff08;RNN&#xff09;5. 卷积神经网络&#xff08;CNN&#xff09; MPL结构工作原理激活函数训练方法 基于神经网络的回归——以钻石为例构建预测钻石价格的M…...

Debezium日常分享系列之:Debezium 3.1.0.Final发布

Debezium日常分享系列之&#xff1a;Debezium 3.1.0.Final发布 重大改变Debezium Core事件源块现在带有版本号稀疏向量逻辑类型重命名更改了模式历史配置的默认值 Debezium Storage moduleJDBC 存储配置命名约定变更 Debezium for Oracle多个 Oracle LogMiner JMX 指标被移除重…...

LLaMA-Factory大模型微调全流程指南

该文档为LLaMA-Factory大模型微调提供了完整的技术指导&#xff0c;涵盖了从环境搭建到模型训练、推理和合并模型的全流程&#xff0c;适用于需要进行大模型预训练和微调的技术人员。 一、docker 容器服务 请参考如下资料制作 docker 容器服务&#xff0c;其中&#xff0c;挂…...

为什么芯片半导体行业需要全星APQP系统?--行业研发项目管理软件系统

为什么芯片半导体行业需要全星APQP系统&#xff1f;--行业研发项目管理软件系统 在芯片半导体行业&#xff0c;严格的合规性要求、复杂的供应链协同及高精度质量管理是核心挑战。全星研发项目管理APQP系统专为高门槛制造业设计&#xff0c;深度融合APQP五大阶段&#xff08;从设…...

Linux make 检查依赖文件更新的原理

1. 文件的时间戳 make 主要依靠文件的时间戳来判断依赖文件是否有更新。每个文件在文件系统中都有一个时间戳&#xff0c;记录了文件的三种重要时间&#xff1a; ​​访问时间&#xff08;Accesstime&#xff09;​​&#xff1a;文件最后一次被访问的时间。​​修改时间&…...

vulkanscenegraph显示倾斜模型(5.6)-vsg::RenderGraph的创建

前言 上一章深入分析了vsg::CommandGraph的创建过程及其通过子场景遍历实现Vulkan命令录制的机制。本章将在该基础上&#xff0c;进一步探讨Vulkan命令录制中的核心封装——vsg::RenderGraph。作为渲染流程的关键组件&#xff0c;RenderGraph封装了vkCmdBeginRenderPass和vkCmd…...

解锁 Python 多线程的潜力:全局解释器锁(GIL)深度解析与优化之道

解锁 Python 多线程的潜力:全局解释器锁(GIL)深度解析与优化之道 引言 Python,这门以简洁和优雅著称的编程语言,自诞生以来在 Web 开发、数据分析、人工智能等领域大放异彩。然而,Python 的多线程性能却常被诟病,其核心原因之一便是全局解释器锁(Global Interpreter …...

基于阿里云可观测产品构建企业级告警体系的通用路径与最佳实践

前言 1.1 日常生活中的告警 任何连续稳定运行的生产系统都离不开有效的监控与报警机制。通过监控&#xff0c;我们可以实时掌握系统和业务的运行状态&#xff1b;而报警则帮助我们及时发现并响应监控指标及业务中的异常情况。 在日常生活中&#xff0c;我们也经常遇到各种各样…...

二叉树的ACM板子(自用)

package 二叉树的中序遍历;import java.util.*;// 定义二叉树节点 class TreeNode {int val; // 节点值TreeNode left; // 左子节点TreeNode right; // 右子节点// 构造函数TreeNode(int x) {val x;} }public class DMain {// 构建二叉树&#xff08;层序遍历方式&…...

架构思维:查询分离 - 表数据量大查询缓慢的优化方案

文章目录 Pre引言案例何谓查询分离&#xff1f;何种场景下使用查询分离&#xff1f;查询分离实现思路1. 如何触发查询分离&#xff1f;方式一&#xff1a; 修改业务代码&#xff1a;在写入常规数据后&#xff0c;同步建立查询数据。方式二&#xff1a;修改业务代码&#xff1a;…...

Qt进阶开发:QFileSystemModel的使用

文章目录 一、QFileSystemModel的基本介绍二、QFileSystemModel的基本使用2.1 在 QTreeView 中使用2.2 在 QListView 中使用2.3 在 QTableView 中使用 三、QFileSystemModel的常用API3.1 设置根目录3.2 过滤文件3.2.1 仅显示文件3.2.2 只显示特定后缀的文件3.2.3 只显示目录 四…...

后端开发常见的面试问题

目录 编程语言 python Linux环境 web框架 数据处理与分析 数据库 图数据库 什么是图数据库&#xff1f;它与传统关系型数据库有什么区别&#xff1f; 图数据库中的节点、边和属性分别代表什么&#xff1f; 常见的图数据库有哪些&#xff1f;它们各自有什么特点&#…...

List结构之非实时榜单实战

像京东、淘宝等电商系统一般都会有热销的商品榜单&#xff0c;比如热销手机榜单&#xff0c;热销电脑榜单&#xff0c;这些都是非实时的榜单。为什么是非实时的呢&#xff1f;因为完全实时的计算和排序对于资源消耗较大&#xff0c;尤其是当涉及大量交易数据时。 一般来说&…...

【C语言】字符串处理函数:strtok和strerror

在C语言中&#xff0c;字符串处理是编程的基础之一。本文将详细讲解两个重要的字符串处理函数&#xff1a;strtok和strerror 一、strtok函数 strtok函数用于将字符串分割成多个子串&#xff0c;这些子串由指定的分隔符分隔。其原型定义如下&#xff1a; char *strtok(char *s…...

如何提升后端开发效率:从Spring Boot到微服务架构

在现代软件开发中&#xff0c;后端开发的效率直接决定了项目的成败。随着技术的快速发展&#xff0c;Spring Boot、微服务架构、Docker等工具和技术已经成为提升后端开发效率的核心利器。在这篇文章中&#xff0c;我们将探讨如何通过使用Spring Boot及微服务架构来提升开发效率…...

go语言:开发一个最简单的用户登录界面

1.用deepseek生成前端页面&#xff1a; 1.提问&#xff1a;请你用html帮我设计一个用户登录页面&#xff0c;要求特效采用科技感的背景渲染加粒子流动&#xff0c;用css、div、span标签&#xff0c;并给出最终合并后的代码。 生成的完整代码如下&#xff1a; <!DOCTYPE h…...

基于 .NET 8 + Lucene.Net + 结巴分词实现全文检索与匹配度打分实战指南

文章目录 前言一、技术选型与优势1.1 技术栈介绍1.2 方案优势 二、环境搭建与配置2.1 安装 NuGet 包2.2 初始化核心组件 三、索引创建与文档管理3.1 构建索引3.2 动态更新策略 四、搜索与匹配度排序4.1 执行搜索4.2 自定义评分算法&#xff08;扩展&#xff09; 五、高级优化技…...

Docker安装、配置Nacos

1.如果没有docker-compose.yml文件的话&#xff0c;先创建docker-compose.yml 配置文件一般长这个样子 version: 3services:nacos:image: nacos/nacos-server:v2.1.1container_name: nacos2ports:- "8848:8848"- "9848:9848"environment:- MODEstandalone…...

《Maven高级应用:继承聚合设计与私服Nexus实战指南》

一、 Maven的继承和聚合 1.什么是继承 Maven 的依赖传递机制可以一定程度上简化 POM 的配置&#xff0c;但这仅限于存在依赖关系的项目或模块中。当一个项目的多个模块都依赖于相同 jar 包的相同版本&#xff0c;且这些模块之间不存在依赖关系&#xff0c;这就导致同一个依赖…...

重要头文件下的函数

1、<cctype> #include<cctype>加入这个头文件就可以调用以下函数&#xff1a; 1、isalpha(x) 判断x是否为字母 isalpha 2、isdigit(x) 判断x是否为数字 isdigit 3、islower(x) 判断x是否为小写字母 islower 4、isupper(x) 判断x是否为大写字母 isupper 5、isa…...

C语言数字分隔题目

一、题目引入 编写一个程序,打印出从用户输入的数字开始,递减到1的序列。要求每次打印一行,数字之间用逗号分隔,最后一个数字后面没有逗号。 二、代码展示 三、运行结果 四、思路分析 1.先用一个for循环对输入的数字进行递减 2.再对for循环里面的数字进行筛选 如果大于1 …...

DigitalOcean 发布 AMD Instinct MI300X GPU 裸金属服务器

DigitalOcean 宣布现已提供 AMD Instinct MI300X GPU&#xff0c;并搭载 ROCm 软件&#xff0c;以支持用户的 AI 任务。 在 DigitalOcean&#xff0c;我们致力于为你的项目提供更多选择。AMD Instinct MI300X 是目前带宽最高的 GPU 之一&#xff08;5.3 TB/s 的 HBM3 内存带宽&…...

CentOS 7 镜像源失效解决方案(2025年)

执行 yum update 报错&#xff1a; yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirror…...