算法题-统计字符个数(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 output


def count_chars_helper(input_str, count, char_count):
    """
    处理括号翻倍的情况,匹配
    :param input_str:
    :param count:
    :param char_count:
    :return:
    """
    i = 0
    while 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 * num
        i += 1


def find_matching_parenthesis(input_str, start_index):
    """
    找到与左括号匹配的右括号的位置
    :param input_str:
    :param start_index:
    :return:
    """
    count = 1
    for i in range(start_index + 1, len(input_str)):
        c = input_str[i]
        if c == '(':
            count += 1
        elif c == ')':
            count -= 1
            if count == 0:
                return i
    return -1


def get_number_after_parenthesis(input_str, start_index):
    """
    获取括号后面的数字
    :param input_str:
    :param start_index:
    :return:
    """
    end_index = start_index
    while end_index < len(input_str) and input_str[end_index].isdigit():
        end_index += 1
    return int(input_str[start_index:end_index]) if end_index > start_index else 1



if __name__ == "__main__":
    print(count_chars("X2Y3XZ"))
    print(count_chars("Z3X(XY)2"))
    print(count_chars("Z4(Y2(XZ2)3)2X2"))

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CAPL通过ethernetPacket发送以太网报文

文章目录 ethernetPacketCANoe帮助文档车载以太网协议函数CAPL通过ethernetPacket发送以太网报文例子ethernetPacket CANoe中,ethernetPacket类似于CAN的message. CANoe帮助文档 CANoe的帮助文档是很好的学习资料,后面会结合CANoe帮助文档来介绍车载以太网的相关内容。 车…

竞赛选题 : 题目:基于深度学习的水果识别 设计 开题 技术

1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/pos…

3_企业级Nginx使用-day2

企业级Nginx使用-day2 学习目标和内容 1、能够编译安装并使用第三方模块 2、能够理解location语法的作用 3、能够了解URL的rewrite重写规则 4、能够理解防盗链原理和实现 一、第三方模块使用 Nginx官方没有的功能&#xff0c;开源开发者定制开发一些功能&#xff0c;把代码公…

Linux中文件的打包压缩、解压,下载到本地——zip,tar指令等

目录 1 .zip后缀名&#xff1a; 1.1 zip指令 1.2 unzip指令 2 .tar后缀名 3. sz 指令 4. rz 指令 5. scp指令 1 .zip后缀名&#xff1a; 1.1 zip指令 语法&#xff1a;zip [namefile.zip] [namefile]... 功能&#xff1a;将目录或者文件压缩成zip格式 常用选项&#xff1a…

百度智能云文字识别使用问题解决合集

1.创建试用程序时需要16位的签名MD5 解决方法&#xff1a;使用Java8 201版本及以下的jdk创建签名 下载地址&#xff1a;http://www.codebaoku.com/jdk/jdk-oracle-jdk1-8.html#jdk8u201 生成签名代码&#xff1a;keytool -genkeypair -v -keystore D:\key.jks -storetype PKC…

Android实验:启动式service

目录 实验目的实验内容实验要求项目结构代码实现结果展示 实验目的 充分理解Service的作用&#xff0c;与Activity之间的区别&#xff0c;掌握Service的生命周期以及对应函数&#xff0c;了解Service的主线程性质&#xff1b;掌握主线程的界面刷新的设计原则&#xff0c;掌握启…

Java研学-配置文件

一 配置文件 1 作用–解决硬编码的问题 在实际开发中,有时将变量的值直接定义在.java源文件中;如果维护人员想要修改数据,无法完成(因为没有修改权限),这种操作称之为硬编码 2 执行原理: 将经常需要改变的数据定义在指定类型的文件中,通过java代码对指定的类型的文件进行操作…

(C语言)找出1-99之间的全部同构数

同构数&#xff1a;它出现在平方数的右边。例&#xff1a;5是25右边的数&#xff0c;25是625右边的数&#xff0c;即5和25均是同构数。 #include<stdio.h> int main() {for(int i 1;i < 100;i ){if((i*i % 10 i) || (i*i % 100 i))printf("%d\t%d\n",i,…

神经网络(第三周)

一、简介 1.1 非线性激活函数 1.1.1 tanh激活函数 使用一个神经网络时&#xff0c;需要决定在隐藏层上使用哪种激活函数&#xff0c;哪种用在输出层节点上。到目前为止&#xff0c;只用过sigmoid激活函数&#xff0c;但是&#xff0c;有时其他的激活函数效果会更好。tanh函数…

图文深入理解TCP三次握手

前言 TCP三次握手和四次挥手是面试题的热门考点&#xff0c;它们分别对应TCP的连接和释放过程&#xff0c;今天我们先来认识一下TCP三次握手过程&#xff0c;以及是否可以使用“两报文握手”建立连接&#xff1f;。 1、TCP是什么&#xff1f; TCP是面向连接的协议&#xff0c;…

Asp.Net Core Web Api内存泄漏问题

背景 使用Asp.Net Core Web Api框架开发网站中使用到了tcp socket通信&#xff0c;网站作为服务端开始tcp server&#xff0c;其他的客户端不断高速给它传输信息时&#xff0c;tcp server中读取信息每次申请的byte[]没有得到及时的释放&#xff0c;导致内存浪费越来越多&#…

从cmd登录mysql

说明 先看看mysql.exe文件在哪个目录下&#xff0c;为了后面的操作方便&#xff0c;可以将该文件所在的路径增加到环境变量path中。 如果不增加到path环境变量中&#xff0c;那么在cmd窗口就要切换到mysql.exe文件所在的目录下执行。 在cmd窗口查看mysql命令的帮助信息 在cm…

vue中实现纯数字键盘

一、完整 代码展示 <template><div class"login"><div class"login-content"><img class"img" src"../../assets/image/loginPhone.png" /><el-card class"box-card"><div slot"hea…

【蓝桥杯软件赛 零基础备赛20周】第6周——栈

文章目录 1. 基本数据结构概述1.1 数据结构和算法的关系1.2 线性数据结构概述1.3 二叉树简介 2. 栈2.1 手写栈2.2 CSTL栈2.3 Java 栈2.4 Python栈 3 习题 1. 基本数据结构概述 很多计算机教材提到&#xff1a;程序 数据结构 算法。 “以数据结构为弓&#xff0c;以算法为箭”…

Linux shell中的函数定义、传参和调用

Linux shell中的函数定义、传参和调用&#xff1a; 函数定义语法&#xff1a; [ function ] functionName [()] { } 示例&#xff1a; #!/bin/bash# get limit if [ $# -eq 1 ] && [ $1 -gt 0 ]; thenlimit$1echo -e "\nINFO: input limit is $limit" e…

Python程序员入门指南:就业前景

文章目录 标题Python程序员入门指南&#xff1a;就业前景Python 就业数据Python的就业前景SWOT分析法Python 就业分析 标题 Python程序员入门指南&#xff1a;就业前景 Python是一种流行的编程语言&#xff0c;它具有简洁、易读和灵活的特点。Python可以用于多种领域&#xff…

Zabbix HA高可用集群搭建

Zabbix HA高可用集群搭建 Zabbix HA高可用集群搭建一、Zabbix 高可用集群&#xff08;Zabbix HA&#xff09;二、部署Zabbix高可用集群1、两个服务端配置1.1主节点 Zabbix Server 配置1.2 备节点 Zabbix Server 配置1.3 主备节点添加监控主机1.4 查看高可用集群状态 2、两个客户…

二、ZooKeeper集群搭建

目录 1、概述 2、安装 2.1 第一步&#xff1a;下载zookeeeper压缩包 2.2 第二步&#xff1a;解压 2.3 第三步&#xff1a;修改配置文件 2.4 第四步&#xff1a;添加myid配置 ​​​​​​​2.5 第五步&#xff1a;安装包分发并修改myid的值 ​​​​​​​2.6 第六步&a…

NXP iMX8M Plus Qt5 双屏显示

By Toradex胡珊逢 简介 双屏显示在显示设备中有着广泛的应用&#xff0c;可以面向不同群体展示特定内容。文章接下来将使用 Verdin iMX8M Plus 的 Arm 计算机模块演示如何方便地在 Toradex 的 Linux BSP 上实现在两个屏幕上显示独立的 Qt 应用。 硬件介绍 Verdin iMX8M Plu…

C++11 类的新功能

新的默认成员函数 C11在6个默认成员函数基础上又加了两个:移动构造函数和移动赋值函数 针对移动构造函数和移动赋值运算符重载有一些需要注意的点如下&#xff1a; 小结&#xff1a; &#xff08;1&#xff09; 生成默认移动构造的条件比较严苛&#xff1a;必须是没有实现析…