算法题-统计字符个数(Python题解)

文章目录

  • 前言
  • 思路
  • code

前言

先前笔试做了一道算法题,题目是这样子的:(PS:不用惊讶,是的,我不打算24今年考研了,一是,当初填报的学校不是我想要去的学校(当初想一战成硕,选了个稳点的学校),二是,最近经历了一些事情让我意识到,成为那个学校的研究生,并不能实现我的预想,大概率下可能还是会回到Java开发,或者其他的开发。至于算法工程师,基本上不用想了。那么竟然如此,在考研上继续浪费时间显然是不值得的。已经错过秋招了,没办法,现在只能想着补救了,或者春招了)当然后不后悔呢,说实话,绕了一圈有点后悔,错误的估计了当前形势。但是通过这段时间的备研,我觉得还是学到了不少东西的,最少除了开发,我把408好好过了过,对于里面的思想有了更深刻的理解。这对于以后的技术提高是有很大帮助的,当然花几个月的时间学那确实有点亏。当然也好在,技术一直没有落下,在暑假打比赛的时候就写了一大半的毕设。后面赶上也很快,复杂的部分都写完了。

那么废话不多说,先来看题吧:
在这里插入图片描述

思路

这里的话,我们可以直接先简单模拟一遍:
例如:X2Y3XZ ,设S为记录个数

1.-> X 此时:S={X:0} (第一次出现,记录为0,解析出后面的数字)
2. ->2 此时:S={X:2}(解析出了后面的数字)
3.->Y 此时:S={X:3,Y:3}
4.->X 此时:S={X:3,Y:3} (此时S[x]=S[x]+1,后面没有解析到数字时)
5.->Z 此时:S={X:3,Y:3,Z:1} (同理)

最后按序输出即可。

那么对于:
存在嵌套的情况:
例如:Z4(Y2(XZ2)3X3

  1. 先统计出括号内部的元素(先考虑单层括号的情况,此时先记录计算出里面的元素个数,方法同第一种情况一致。此时将这一组记录看作是一个元素,然后按照外层的方式再处理)
  2. 对于括号内有括号嵌套的情况,这里采用递归的方式继续进行处理,得到一组记录,然后再将这一组记录看作是一个元素,同上述处理。

那么思路上的话,我们就非常明确了,你可以发现,这个其实就是一个基本的模拟题,但是里面需要注意的细节是比较多的,但是不管怎么说,时间复杂度是0(n)的。所以这里我们就可以很快的写出代码。

code

ok,这里我们刚刚明确了思路,所以我们来看到代码:
(由于代码有注释,那么这里就不多废话了)

def count_chars(input_str):"""负责统计字符个数:param input_str::return:"""char_count = {}count_chars_helper(input_str, 1, char_count)output = ""sorted_keys = sorted(char_count.keys())for key in sorted_keys:output += key + str(char_count.get(key))return outputdef count_chars_helper(input_str, count, char_count):"""处理括号翻倍的情况,匹配:param input_str::param count::param char_count::return:"""i = 0while i < len(input_str):c = input_str[i]if c == '(':#找到(XXXX),然后方面记录里面的元素的个数,方面后面做统计累加end_index = find_matching_parenthesis(input_str, i)num = get_number_after_parenthesis(input_str, end_index + 1)# 处理嵌套括号的问题count_chars_helper(input_str[i + 1:end_index], count * num, char_count)i = end_index + len(str(num))elif c.isalpha():# 对统计出的这一组元素*后面的数字的处理,然后累加num = get_number_after_parenthesis(input_str, i + 1)char_count[c] = char_count.get(c, 0) + count * numi += 1def find_matching_parenthesis(input_str, start_index):"""找到与左括号匹配的右括号的位置:param input_str::param start_index::return:"""count = 1for i in range(start_index + 1, len(input_str)):c = input_str[i]if c == '(':count += 1elif c == ')':count -= 1if count == 0:return ireturn -1def get_number_after_parenthesis(input_str, start_index):"""获取括号后面的数字:param input_str::param start_index::return:"""end_index = start_indexwhile end_index < len(input_str) and input_str[end_index].isdigit():end_index += 1return int(input_str[start_index:end_index]) if end_index > start_index else 1if __name__ == "__main__":print(count_chars("X2Y3XZ"))print(count_chars("Z3X(XY)2"))print(count_chars("Z4(Y2(XZ2)3)2X2"))

当然这里要注意的细节如下:

  1. 要求是按照字母序号进行输出,所以要对结果进行排序
  2. 在对括号进行处理的时候,可以使用栈进行处理,可以先对表达式做一个预处理,得到下标位置,然后压入栈,这样的话可以减少对下标的处理难度,但是需要对栈有一点了熟练度。并且由于时间复杂度都是0(n)的,直接遍历处理倒也还行。

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

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

相关文章

【HuggingFace Transformer库学习笔记】基础组件学习:Tokenizer

基础组件——Tokenizer &#xff08;1&#xff09;模型加载 from transformers import AutoTokenizersen "弱小的我也有大梦想!" # 从HuggingFace加载&#xff0c;输入模型名称&#xff0c;即可加载对于的分词器 tokenizer AutoTokenizer.from_pretrained("m…

华为电视盒子 EC6108V9C 刷机成linux系统

场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 家里装宽带的时候会自带电视盒子&#xff0c;但是由于某些原因电视盒子没有用&#xff0c;于是就只能摆在那里吃土&#xff0c;闲来无事&#xff0c;搞一下 问题描述 提示&#xff1a;这里描述项目中遇到…

【数据结构和算法】找出叠涂元素

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 三、代码 四、复杂度分析 前言 这是力扣的2661题&#xff0c;难度为中等&#xff0c;解题方案有很多种&…

Linux 系统是如何收发网络包的?(计算机网络)

一、Linux 网络协议栈 如下是TCP/IP四层网络模型&#xff0c;实际上Linux 网络协议栈与它相似 下图是Linux 网络协议栈 二、Linux 接收网络包的流程 1.网卡是计算机里的一个硬件&#xff0c;专门负责接收和发送网络包&#xff0c;当网卡接收到一个网络包后&#xff0c;会通过…

15、 深度学习之正向传播和反向传播

上一节介绍了训练和推理的概念,这一节接着训练和推理的概念讲一下,神经网络的正向传播和反向传播。 其实单看正向传播和反向传播这两个概念,很好理解。 正向传播(Forward Propagation)是指从输入层到输出层的数据流动过程,而反向传播(Backpropagation)是指数据从输出…

国际语音群呼系统

随着海外电话营销的发展&#xff0c;越来越多的出海企业通过国际语音群呼系统打开出海营销之路。企业出海营销运营&#xff0c;选择一个安全、高效、便捷的国际语音群呼系统非常重要。 一、什么是国际语音群呼系统&#xff1f; 国际语音群呼是指通过语音的方式批量向海外用户传…

如何使用 NFTScan NFT API 在 Starknet 网络上开发 Web3 应用

Starknet 是由以色列软件公司 StarkWare 开发的免许可的第 2 层网络。Starknet 作为以太坊上的 ZK Rollup 运行&#xff0c;帮助 dApp 使用 STARK 证明以更低的交易成本实现更大的计算规模。该网络允许智能合约与区块链上部署的其他合约进行交互&#xff0c;从而提高协议之间的…

drawio画图工具的四种使用方式

1、免安装使用&#xff08;绿色版&#xff09; 这种直接下载下来直接就可以使用&#xff0c;属于绿色版&#xff08;开箱即用&#xff09;&#xff0c;适用于个人 点击下载地址 2、 安装使用 这种下载下来就需要安装才可使用&#xff0c;适用于个人 点击下载地址 3、war包…

用100ask 6ull配合 飞凌 elf1的教程进行学习的记录

启动方式 百问网 elf1: 固件 emmc-otg 串口 网络 改eth0, 网线接在右边的网口eth2上

【高效开发工具系列】驼峰下划线互转

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

大数据技术之Oozie

大数据技术之Oozie 第1章 Oozie简介 Oozie英文翻译为&#xff1a;驯象人。一个基于工作流引擎的开源框架&#xff0c;由Cloudera公司贡献给Apache&#xff0c;提供对Hadoop MapReduce、Pig Jobs的任务调度与协调。Oozie需要部署到Java Servlet容器中运行。主要用于定时调度任…

NSDT场景编辑器实现真数字孪生

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 1、什么是数字孪生&#xff1f; 数字孪生是资产或系统的实时虚拟模型&#xff0c;它使用来自连…

spring boot 整合 spring security

项目结构 添加依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEASE</version><relativePath/></parent><dependency><grou…

UiPath:人工智能和重新加速增长是 2024 年的好兆头

UiPath&#xff08;NYSE&#xff1a;PATH&#xff09;重新加速增长&#xff0c;同时在销售和营销方面变得最高效&#xff0c;使其成为进入 2024 年的有吸引力的成长型股票。 UiPath 最初被归类为机器人流程自动化 (RPA) 公司&#xff0c;现在认为自己是一家人工智能驱动的自动…

MATLAB R2022b 安装

文章用于学习记录 文章目录 前言下载解压安装包总结 前言 下载解压安装包 MATLAB R2022b —— A9z3 装载(Mount) MATLAB_R2022b_Win64.iso 打开装载好的 DVD 驱动器并找到 setup&#xff0c;单击鼠标右键以管理员身份运行&#xff1a; 点击窗口右上角的 高级选项下拉框&#…

【UGUI】Unity为下拉菜单添加选项(DropDown)

要想控制谁就把谁拿到代码里-获取组件-修改组件参数&#xff08;变量或者方法&#xff09; 代码示例&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro;public class UIcontrol : MonoBehavi…

贝叶斯网络 (期末复习)

文章目录 贝叶斯网络&#xff08;概率图模型&#xff09;定义主要考点例题- 要求画出贝叶斯网络图- 计算各节点的条件概率表- 计算概率-分析独立性 贝叶斯网络&#xff08;概率图模型&#xff09; 定义 一种简单的用于表示变量之间条件独立性的有向无环图&#xff08;DAG&…

一线大厂Redis高并发缓存架构(待完善)

场景1&#xff1a;秒杀库存场景&#xff0c; 10000人抢100个商品 如果用普通的分布式锁实现&#xff0c; 最后抢到的人&#xff0c;要等前面99个人抢完 优化方案&#xff1a;可用分段锁&#xff0c; 降低锁的粒度&#xff0c; 比如1-10库存用锁product:101_1,11-20库存用锁pr…

MySQL -DDL 及表类型

DDL 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification:[DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1.CHARACTER SET&#xff1a…

PT读spef报PARA-006如何解决?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 There are multiple causes that can trigger PARA-006 errors. Here is a checklist. 1) SPEF reading order Functionally, the parasitic files can be read in any order. For best stitching…