Python面试宝典第49题:字符串压缩

news2024/12/28 8:58:47

题目

        给你一个字符数组chars ,请使用下述算法进行压缩。

        1、从一个空字符串s开始,对于chars中的每组连续重复字符 :

        (1)如果这一组长度为1 ,则将字符追加到s中。

        (2)否则,需要向s追加字符,后跟这一组的长度。

        2、压缩后得到的字符串s不应该直接返回 ,需要转储到字符数组chars中。需要注意的是,如果组长度为10或10以上,则在chars数组中会被拆分为多个字符。

        请在修改完输入数组后 ,返回该数组的新长度。

        备注:chars[i]可以是小写英文字母、大写英文字母、数字或符号。

        示例 1:

输入:chars = ["a","a","b","b","c","c","c"]
输出:返回6 ,输入数组的前6个字符应该是["a","2","b","2","c","3"]。
解释:"aa"被"a2"替代,"bb"被"b2"替代,"ccc"被"c3"替代。

        示例 2:

输入:chars = ["a"]
输出:返回1,输入数组的前1个字符应该是["a"]。
解释:唯一的组是"a",它保持未压缩,因为它是一个字符。

        示例 3:

输入:chars = ["a","b","b","b","b","b","b","b","b","b","b","b","b"]
输出:返回4,输入数组的前4个字符应该是["a","b","1","2"]。
解释:由于字符"a"不重复,所以不会被压缩,"bbbbbbbbbbbb"被"b12"替代。

使用栈

        使用栈来求解本题的基本思想是:利用栈这种数据结构来存储连续重复字符的信息。解题的主要步骤如下。

        1、初始化栈。创建一个栈,用于存放字符及其重复次数。

        2、遍历数组。从左至右,遍历输入数组chars。

        3、处理字符。如果栈为空,或当前字符与栈顶字符不同,将当前字符及其初始计数1压入栈中。如果当前字符与栈顶字符相同,增加栈顶计数。

        4、构建压缩后的字符串。当遍历完整个数组后,从栈中弹出字符及其计数,并将它们按照规则添加到结果数组中。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def string_compression_by_stack(chars):
    stack = []
    write_index = 0

    for read_index in range(len(chars)):
        # 如果栈为空,或者当前字符与栈顶字符不同
        if not stack or chars[read_index] != stack[-1][0]:
            # 入栈
            stack.append([chars[read_index], 1])
        else:
            # 更新计数
            stack[-1][1] += 1

    # 构建压缩后的字符串
    for char, count in stack:
        # 写入字符
        chars[write_index] = char
        write_index += 1
        # 如果计数大于1,则写入计数
        if count > 1:
            # 将计数按位写入
            for digit in str(count):
                chars[write_index] = digit
                write_index += 1

    return write_index

chars = ["a", "a", "b", "b", "c", "c", "c"]
new_length = string_compression_by_stack(chars)
print(new_length)
print(chars[:new_length])

chars = ["a"]
new_length = string_compression_by_stack(chars)
print(new_length)
print(chars[:new_length])

chars = ["a","b","b","b","b","b","b","b","b","b","b","b","b"]
new_length = string_compression_by_stack(chars)
print(new_length)
print(chars[:new_length])

双指针法

        双指针法利用了一个基本事实:压缩后的字符数组通常情况下比原数组要短,最坏情况下一样长。我们可以使用两个指针:read_index和write_index。read_index用于读取原数组中的字符,write_index用于写入压缩后的结果。遍历原数组,当遇到相同的字符时,更新计数。当遇到不同的字符时,将当前字符及其计数(如果大于1)写入到chars数组中,并更新write_index。使用双指针法求解本题的主要步骤如下。

        1、初始化,将read_index和write_index置为0。

        2、遍历chars数组,使用read_index逐个读取字符,并进行以下操作。

        (1)使用一个变量count,记录当前字符的重复次数。

        (2)当遇到不同的字符时,将当前字符和其重复次数写入chars数组的write_index位置,并更新 write_index。

        3、返回write_index作为新长度。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def string_compression_by_two_pointers(chars):
    read_index = 0
    write_index = 0
    n = len(chars)

    while read_index < n:
        char = chars[read_index]
        count = 0
        # 一直遍历到不同的字符为止
        while read_index < n and chars[read_index] == char:
            read_index += 1
            count += 1
        
        # 先写入字符
        chars[write_index] = char
        write_index += 1
        
        # 如果计数大于1,再写入计数
        if count > 1:
            for digit in str(count):
                chars[write_index] = digit
                write_index += 1

    return write_index

chars = ["a", "a", "b", "b", "c", "c", "c"]
new_length = string_compression_by_two_pointers(chars)
print(new_length)
print(chars[:new_length])

chars = ["a"]
new_length = string_compression_by_two_pointers(chars)
print(new_length)
print(chars[:new_length])

chars = ["a","b","b","b","b","b","b","b","b","b","b","b","b"]
new_length = string_compression_by_two_pointers(chars)
print(new_length)
print(chars[:new_length])

总结

        使用栈来求解本题时,需要遍历输入数组一次,每个字符至多入栈和出栈各一次。故时间复杂度为O(n),其中n是输入数组的长度。其空间复杂度为O(n),需要额外的空间来存储栈。

        双指针法的时间复杂度也为O(n),但其空间复杂度仅为O(1),不需要额外的空间。与使用栈的方法相比,双指针法效率更高,但在理解上可能稍微复杂一些。

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

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

相关文章

易灵思FPGA开发(一)——软件安装

一、资料下载 VF-T20F256-深圳市奥唯思科技有限公司_FPGA图像开发_MIPI (szovs.com) 二、软件安装 安装USB下载器驱动 双击第一个.msi文件进行安装 奥唯思FPGA网盘汇总 (szovs.com) 下载Gtkwave软件

初始MYSQL数据库(5)—— 索引

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 目录 索引的概念 索引选择的数据结构 MySQL中的页的相关知识 索引的分类 主键索引 普通索引 唯一索引 非聚集索引 回表查询…

基于python+django+vue的宠物服务管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的宠…

云原生(Cloud Native)简介及相关技术

云原生&#xff08;Cloud Native&#xff09;简介及相关技术 什么是云原生&#xff1f; 云原生&#xff08;Cloud Native&#xff09;是一种设计和开发应用程序的方法&#xff0c;旨在充分利用云计算的弹性、可扩展性和分布式架构优势。通过采用微服务架构、容器化、持续集成…

【自动驾驶】决策规划算法(一)决策规划仿真平台搭建 | Matlab + Prescan + Carsim 联合仿真基本操作

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

Java | Leetcode Java题解之第413题等差数列划分

题目&#xff1a; 题解&#xff1a; class Solution {public int numberOfArithmeticSlices(int[] nums) {int n nums.length;if (n 1) {return 0;}int d nums[0] - nums[1], t 0;int ans 0;// 因为等差数列的长度至少为 3&#xff0c;所以可以从 i2 开始枚举for (int i …

硬件工程师笔试面试——集成电路

目录 17、集成电路 17.1 基础 集成电路实物图 17.1.1 概念 17.1.2 集成电路的发展历程 17.1.3 集成电路的分类 17.1.4 集成电路的制造工艺 17.1.5 集成电路的应用 17.2 相关问题 17.2.1 集成电路的制造工艺中,光刻技术是如何实现的? 17.2.2 在集成电路设计中,如何…

【Python百日进阶-Web开发-FastAPI】Day801 - FastAPI是什么

文章目录 一、官网二、FastAPI是什么三、FastAPI特性3.1 基于开放标准3.2 自动生成文档3.3 更主流的 Python3.4 编辑器支持3.5 简洁3.6 验证3.7 安全性及身份验证3.8 依赖注入3.9 无限制"插件"3.10 测试四、Starlette 特性五、Pydantic 特性六、Python 类型提示简介6…

DERP靶机详解

靶机下载地址 https://www.vulnhub.com/entry/derpnstink-1,221/ 靶机配置 默认是桥接模式&#xff0c;切换为NAT模式后重启靶机 主机发现 arp-scan -l 端口扫描 nmap -sV -A -T4 192.168.229.158 访问网页 http://192.168.229.158/ 目录扫描 python dirsearch.py -u htt…

css边框修饰

一、设置线条样式 通过 border-style 属性设置&#xff0c;可选择的一些属性如下&#xff1a; dotted&#xff1a;点线 dashed&#xff1a;虚线 solid&#xff1a;实线 double&#xff1a;双实线 效果如下&#xff1a; 二、设置边框线宽度 ① 通过 border-width 整体设置…

量化在密集向量检索中的权衡:深入分析索引时间、查询效率与召回效果

在现代信息检索系统中&#xff0c;向量搜索已成为提升检索质量和效率的关键技术。随着数据量的激增&#xff0c;如何高效地处理和检索大规模向量数据集&#xff0c;成为了一个重要课题。最近&#xff0c;我在研究一篇关于密集和稀疏检索器的论文——《Operational Advice for D…

【图像匹配】基于Harris算法的图像匹配,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于基于Harris算法的图像匹配&#xff0c;用matlab实现。 一、案例背景和算法介绍 …

无人机培训机构技术股份合作探讨

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、物流、环境监测、应急救援等多个领域展现出巨大潜力&#xff0c;市场对无人机专业人才的需求急剧增加。鉴于此&#xff0c;多家致力于无人机培训教育的机构决定携手合作&#xff0c;通过技术股份合作模式&#xff0c;共同…

基于RBAC的实验室预约系统中授权模块的研究与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

kali——foremost的使用

目录 前言 使用方法 前言 foremost工具是一个在Kali Linux中用于数字取证和数据恢复的强大工具。 使用方法 foremost -t all -i 数据包绝对路径修复好的数据包&#xff0c;将会自动保存在output目录里。

7--SpringBoot-后端开发、原理

配置优先级 SpringBoot 项目当中支持的三类配置文件&#xff1a; application.properties application.yml application.yaml 配置文件优先级排名&#xff08;从高到低&#xff09;&#xff1a; 1. properties配置文件 2. yml配置文件 3. yaml配置文件 在SpringBoot项目当…

Effective C++笔记之二十三:非void函数不写return

一.main函数 Qt Creator查看汇编的步骤如下 上图是g编译器下的汇编 eax就是main()函数的返回值 如果删掉return 0&#xff1b; 可以发现编译器还是把eax的值设为了0&#xff0c;由此可见&#xff0c;即使在main函数中不写return 0&#xff0c;编译器还是会默认添加个return 0。…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾收集器

文章目录 垃圾回收机制Stop-the-World垃圾收集器垃圾收集器分类Serial 收集器Serial Old 收集器ParNew 收集器Parallel Scavenge 收集器Parallel Old 收集器CMS 收集器CMS 收集器缺点 G1 收集器G1 收集器特点G1 收集器的分代理念G1 收集器运作过程 垃圾回收机制 垃圾回收&…

二、Servlet

文章目录 1. Servlet技术1.1 什么是Servlet1.2 手动实现 Servlet 程序1.3 url 地址到 Servlet 程序的访问1.4 Servlet 的生命周期1.5 GET 和 POST 请求的分发1.6 通过继承 HttpServlet 实现 Servlet 程序1.7 使用 IDEA 创建 Servlet 程序1.8 Servlet 类的继承体系 2. ServletCo…

计算机人工智能前沿进展-大语言模型方向-2024-09-13

计算机人工智能前沿进展-大语言模型方向-2024-09-13 1. OneEdit: A Neural-Symbolic Collaboratively Knowledge Editing System Authors: Ningyu Zhang, Zekun Xi, Yujie Luo, Peng Wang, Bozhong Tian, Yunzhi Yao, Jintian Zhang, Shumin Deng, Mengshu Sun, Lei Liang, Z…