面试经典(2)---删除特定字符

2023-10-27

题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.””aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

分析:

我们考虑如何在字符串中删除一个字符。由于字符串的内存分配方式是连续分配的。我们从字符串当中删除一个字符,需要把后面所有的字符往前移动一个字节的位置。但如果每次删除都需要移动字符串后面的字符的话,对于一个长度为n的字符串而言,删除一个字符的时间复杂度为O(n)。而对于本题而言,有可能要删除的字符的个数是n,因此该方法就删除而言的时间复杂度为O(n2)

事实上,我们并不需要在每次删除一个字符的时候都去移动后面所有的字符。我们可以设想,当一个字符需要被删除的时候,我们把它所占的位置让它后面的字符来填补,也就相当于这个字符被删除了。在具体实现中,我们可以定义两个指针(pFastpSlow),初始的时候都指向第一字符的起始位置。当pFast指向的字符是需要删除的字符,则pFast直接跳过,指向下一个字符。如果pFast指向的字符是不需要删除的字符,那么把pFast指向的字符赋值给pSlow指向的字符,并且pFastpStart同时向后移动指向下一个字符。这样,前面被pFast跳过的字符相当于被删除了。用这种方法,整个删除在O(n)时间内就可以完成。

代码如下:

void deleteChars(char *pStrSource,const char *pStrDelete)
{
	if(NULL==pStrSource || NULL==pStrDelete)
		return;
	const unsigned int nTableSize=256;
	int hashTable[nTableSize];
	memset(hashTable,0,sizeof(hashTable));

	const char *pTemp=pStrDelete;
	while(*pTemp!='\0')
	{
		hashTable[*pTemp]=1;
		++pTemp;
	}

	char *pFast=pStrSource;
	char *pSlow=pFast;

	while(*pFast)
	{
		if(!hashTable[*pFast])
		{
			*pSlow=*pFast;
			++pSlow;
		}
		++pFast;
	}
	*pSlow='\0';
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试经典(2)---删除特定字符 的相关文章

  • chrome控制台修改JS的变量值

    最近突然闲着没事想起来之前一个前端比较好玩的东西 然后记录一下 注注注 我是专业后台搬砖工 这是修改前的 所有流程都是正常走的 if里的也没有打印出来 然后 我们改改 坏笑 先进控制台在判断那块打出断点 然后找到右边的Global 所有的变
  • Ubuntu22.04安装CUDA和cuDNN详细过程记录

    文章目录 一 安装显卡驱动 二 安装CUDA 三 安装cuDNN 四 更换cuDNN版本 参考资料 一 安装显卡驱动 1 终端中输入以下命令获取显卡和驱动信息 ubuntu drivers devices 以我自己的机器为例 显示结果如下
  • C++杂谈 为什么类的空指针对象可以访问类某些的成员函数

    class TestObject public TestObject std cout lt lt TestObject lt lt std endl TestObject std cout lt lt TestObject lt lt s
  • 华为HCIE云计算之FC添加ipsan数据存储

    华为HCIE云计算之FC添加ipsan数据存储 一 登录华为OceanStor仿真器 二 在数据存储创建LUN 1 创建硬盘域 2 创建存储池 3 创建LUN和LUN组 4 创建主机和主机组 5 创建映射关系 三 配置数据存储的端口IP 1
  • opencv进阶19-基于opencv 决策树cv::ml::DTrees 实现demo示例

    opencv 中创建决策树 cv ml DTrees类表示单个决策树或决策树集合 它是RTrees和 Boost的基类 CART是二叉树 可用于分类或回归 对于分类 每个叶子节点都 标有类标签 多个叶子节点可能具有相同的标签 对于回归 每个
  • GPT-4 最强竞争对手,Claude 杀疯了!

    这是 进击的Coder 的第 851 篇技术分享 作者 小 G 来源 GitHubDaily 阅读本文大概需要 6 分钟 在今年早些时候 ChatGPT Bard Claude 等大语言模型 在 AI 领域呈三权鼎立之势 无人能出其右 被视

随机推荐

  • 如何解析hdlc帧7E头(帧格式分析实例)

    0 前言 作为一名嵌入式工程师 经常需要通过UART与外设打交道 而对于串行总线来说 往往我们必须要进行帧同步 通常的做法是把信令包含在2个0x7E的中间 除此之外还有HDLC PPP等协议也会到有此应用场景 那么如何从这些数据帧中提取有效
  • pip3 config 更新源问题

    pip源配置文件可以放置的位置 Linux Unix etc pip con pip pip conf 每一个我都找了都没有 所以我是在这个文件夹中创建的pip conf文件 config pip pip conf Mac OSX Libr
  • mybatis插入数据的时候获取自增的id

    1 自增的是int类型
  • 数据挖掘实验(八):DBSCAN聚类 R语言

    一 实验目的 了解DBSCAN算法基本原理 编写代码并实现DBSCAN算法对数据的聚簇 二 实验步骤 采用的数据集 R语言factoextra包里的multishapes数据集 函数首先确定两个参数 1 epsilon 在一个点周围邻近区域
  • 在sql查询中使用表变量实现上一条下一条记录

    SET ANSI NULLS ON GO SET QUOTED IDENTIFIER ON GO Author
  • 1046 划拳

    划拳是古老中国酒文化的一个有趣的组成部分 酒桌上两人划拳的方法为 每人口中喊出一个数字 同时用手比划出一个数字 如果谁比划出的数字正好等于两人喊出的数字之和 谁就赢了 输家罚一杯酒 两人同赢或两人同输则继续下一轮 直到唯一的赢家出现 下面给
  • Qt开发 — QProcess执行带管道的shell命令

    Qt开发 QProcess执行带管道的shell命令 简述 在嵌入式开发过程中 很容易遇到一些需要开辟新的进程 而新的进程里面又需要强制关闭父进程的操作 不如程序中需要读写SD卡 但是有时程序中又需要格式化SD卡 这就遇到问题 需要在SD卡
  • Netty实现UDP

    最近写的tcp和udp 以前经常写tcp 这次突然多一个udp 这次就献上udpserver的代码 import io netty bootstrap Bootstrap import io netty channel ChannelOpt
  • 上采样方式(反卷积、插值、反池化)

    目录 1 反卷积 1 正常卷积 2 反卷积 2 反池化 3 插值法 1 最近邻插值
  • 颜色的前世今生11·RGB显色系统详解(上)

    上一章讲完了拾色器的HSB模式 今天继续分解RGB模式 同理 RGB拾色器难的并不是软件界面本身 而是要理解RGB显色系统本身的原理 特点和局限性 才能心中有数 游刃有余 1 RGB色光加法色原理 人眼的视网膜有两种感光细胞 可以感应颜色细
  • vue2+element封装rules, 支持json多层级

    一 封装介绍 封装前景 表单内容多 表单类型重复且校验项较多 下面就参考element的例子写个实例 element地址 https element eleme cn 2 15 zh CN component form 实现效果如下 今天给
  • 适用于 Linux 的 Windows 子系统(WSL)安装指南

    目录 Windows Subsystem for Linux 一 WSL安装 1 启用 适用于Linux的Windows子系统 2 启用开发人员模式 3 安装UWP下Ubuntu LTS 4 启动子系统Linux 二 设置Windows T
  • 0.1 Redis安装

    1 Redis安装要求 64位Linux系统 Linux系统具备GCC编译环境 查看多少位 getconf LONG BIT 安装gcc环境 yum y install gcc c 查看gcc版本 gt 4 8 5版本 gcc v 2 安装
  • 个人代码笔记5——希尔排序

    1 背景 基于插入排序提出的更高效的方法 希尔排序 改善了插入排序因为元素顺序或个数而影响效率的问题 2 思路 希尔排序是先将元素分组 一般分成两组 然后各自插入排序 再合并 继续对折增量 分组并插入排序 再合并 如此重复 直到增量 lt
  • Redis入门学习的三个阶段10个知识点

    Redis入门学习有三个阶段8个模块 初识Redis 认识NoSQL 认识Redis 安装Redis Redis常见命令 5种常见数据结构 通用命令 不同数据结构的操作命令 Redis的Java客户端 Jedis客户端 SpringData
  • mac 安装 homebrew

    摘要 本文主要是下载安装包安装homebrew 然后配置环境变量Path 检验是否安装成功 homebrew地址 macOS 或 Linux 缺失的软件包的管理器 Homebrew 在终端命令下载安装 bin bash c curl fsS
  • 使用python进行数据提取和数据处理

    Whenever a dataset comes the first step is to extract data and manipulate it It is the most important part as it gives t
  • 组合预测模型

    组合预测模型 BO MLP贝叶斯优化多层感知机多输入单输出回归预测 Matlab程序 目录 组合预测模型 BO MLP贝叶斯优化多层感知机多输入单输出回归预测 Matlab程序 预测结果 评价指标 基本介绍 程序设计 参考资料 预测结果 评
  • 在Spring Boot应用程序中测试邮件代码

    在构建Spring Boot应用程序时 您可能会需要添加邮件配置 实际上 在Spring Boot中配置邮件与在Spring Bootless应用程序中配置邮件没有太大区别 但是 如何测试邮件配置和提交工作正常 我们来看一下 我假设我们有一
  • 面试经典(2)---删除特定字符

    题目 输入两个字符串 从第一字符串中删除第二个字符串中所有的字符 例如 输入 They are students 和 aeiou 则删除之后的第一个字符串变成 Thy r stdnts 分析 我们考虑如何在字符串中删除一个字符 由于字符串的