数据结构作业整理:扩展字符

题目展示:

【问题描述】
从键盘输入包含扩展符'-'的字符串,将其扩展为等价的完整字符,例如将a-d扩展为abcd,并输出扩展后的字符串。

要求:只处理[a-z]、[A-Z]、[0-9]范围内的字符扩展,即只有当扩展符前后的字符同时是小写字母、大写字母或数字,并且扩展符后的字符大于扩展符前的字符时才进行扩展,其它情况不进行扩展,原样输出。例如:a-R、D-e、0-b、4-B等字符串都不进行扩展。


【输入形式】
从键盘输入包含扩展符的字符串
【输出形式】
输出扩展后的字符串

【输入样例1】
ADEa-g-m02
【输出样例1】
ADEabcdefghijklm02

【输入样例2】
cdeT-bcd
【输出样例2】
cdeT-bcd

【样例说明】
将样例1的输入ADEa-g-m02扩展为:ADEabcdefghijklm02;样例2的输入cdeT-bcd中,扩展符前的字符为大写字母,扩展符后的字符为小写字母,不在同一范围内,所以不进行扩展。 

思路分析:

首先我们明确一下这道题的目的,即:如果出现“-”且前后均为同类型的字符(整数,大写小写字母),并且满足扩展的顺序(前面的小于后面的),则对其进行扩展,将“-”替换为前后两个字符中间的字符。

所以我们要处理以下的问题:

1.如何判断前后字符是否符合条件

2.如何进行替换,选择什么样的数据结构来进行实现?是否只需要对原来的字符串进行操作?还是需要额外再申请空间?

切入点是:把“-”替换成为中间的字符,那么,首先想到的是读到“-”的时候就去把相应的位置替换。但是原来的字符串没有办法扩展空间(当然如果是使用的动态内存申请另说),而且就算使用的是动态内存申请,那么每添加一个字符就会需要把后面所有的字符全部向后移动一位,因此耗费时间很大,并不划算。(这里没有使用链表,当然,如果使用链表的话会非常简单)

在不使用链表的情况下,我们只能选择数组来进行数据的存储。这里我来谈谈第一个很重要的思想:删除/替换,不一定非要盯着原来的结构不放,不妨换个思路,使用另外一个数组来把符合条件的元素留下,再把需要进行操作的元素进行相应的操作后再放进新的数组里面,这样就会节省很多的时间

因此,我们使用新数组newstr来存储改变后的字符串。具体的操作如下:

1.从头开始遍历,当元素不是要被替换的元素时,直接把他存储到新数组中。

2.当遇到“-”的时候,把前面一个字符记为begin,后面一个字符记为end,然后对这两个字符进行是否符合条件的判断,如果符合,那么进行一个while循环,把从begin到end的所有字符放入新数组中,然后原数组继续前进;如果不符合条件,直接原数组前进,跳过“-”。

3.最后在新数组后面加上“\0”,代表他是一个字符串。

其实整个过程还是十分清晰的,关键点有几个:

1.使用新数组进行存储,让时间复杂度为O(n).

2.最后要给新的字符串加上‘\0’让输出能够正常输出。

小小的延申:

针对这道题,其实还有一个很相像的操作,即删除字符串中的指定字符,这个由于我们一种思路是可以使用新数组来存储,但是需要花费额外的空间;还有一种的可行思路是:只针对字符串的本身进行操作,使用类似双指针的方法,设置快慢指针(即快慢下标),如果是正常的字符,快慢下标同时向前移动,快指针给满指针赋值;当遇到要被删除的指针时,快指针还是正常向前,但是慢指针则停在原处,此时快指针已经跳过了待删除的字符,直接将下一位字符赋值给仍然处在待删除位置的慢指针,将原来的内容覆盖掉了,巧妙地实现了覆盖。

那么如何实现快与慢呢?快指针由于是全过程都需要遍历的,因此我们可以把它放在循环的条件中,不受条件的约束;而慢指针则需要用if条件来判断,他的向前是依靠于是否有条件出现的。在条件中赋值时把慢指针的前移用j++放在数组下标中实现,i++则在循环的条件中,当遇到指定字符时,不执行慢指针向前并赋值的操作,实现跳过。

void squeez(char s[],char c)
{int i,j;for(i=j=0;s[i]!='\0';i++)//i是正常移动的if(s[i]!=c)s[j++]=s[i];//如果等于c时,则不执行j++操作,意味着慢指针不移动s[j]='\0';
}

代码实现:

#include <stdio.h>  
#include <ctype.h>  
#include <string.h>  
#include <stdlib.h>  int main() {  char s[1000];  char *newstr;  int begin, end;  gets(s); int len = strlen(s);  newstr = (char *)malloc(sizeof(char)*(len+1000));int j = 0;  for (int i = 0; i < len; i++) {  if (s[i] == '-') {//这个if是如果有“-”相应操作 if ((i > 0 && i < len - 1) &&((isupper(s[i - 1]) && isupper(s[i + 1]) )||(isdigit(s[i - 1]) && isdigit(s[i + 1]))||(islower(s[i-1])&&islower(s[i+1])))) //条件判断1,是否符合类型一致{   begin = s[i - 1];  end = s[i + 1];  if ((isupper(begin) && isupper(end) && end > begin) ||(isdigit(begin) && isdigit(end) && end > begin)||(islower(s[i-1])&&islower(s[i+1])))//条件判断2,是否顺序正确{  for (char c = begin+1; c <= end; c++) {  newstr[j++] = c;  //把缺失的补全}  i++; //原数组向前移一位,进行下一位的判断continue;  }  }  } newstr[j++] = s[i]; //正常的字符直接读入即可}  newstr[j] = '\0';printf("%s\n", newstr);  free(newstr);return 0;  
}

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

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

相关文章

5、Jenkins持续集成-Maven和Tomcat的安装与配置

文章目录 一、Maven的安装与配置1、安装maven并配置环境2、全局工具配置关联jdk和maven3、添加Jenkins全局变量4、修改settings.xml文件5、测试是否配置成功二、Tomcat的安装与配置1、安装tomcat8+2、配置Tomcat用户角色权限3、测试是否配置成功一、Maven的安装与配置 在Jenki…

安全点安全区的通俗理解

想象一下&#xff0c;JVM&#xff08;Java虚拟机&#xff09;是一个忙碌的工厂&#xff0c;而Java程序中的线程就像是工厂里的工人。在这个工厂中&#xff0c;有时需要进行一些大规模的清理工作&#xff0c;比如垃圾回收&#xff0c;来确保工厂运行得更加高效。但是&#xff0c…

Facebook是什么?有什么功能?如何利用Facebook运营?

Facebook&#xff0c;也常被人们称为“脸书”、“脸谱”等&#xff0c;是美国的社交网络服务及社会化媒体网站&#xff0c;拥有超过20亿的月活跃用户&#xff0c;对于众多商家而言&#xff0c;Facebook以其广泛的用户基础和强大的社交影响力&#xff0c;成为了一个理想的社媒营…

Qt源码分析:QMetaObject实现原理

Qt基于QMetaObject实现了信号/槽机制、属性机制等多个功能特性&#xff0c;而QMetaObject实际上是实现了一种反射机制。 Ref. from Reflection in Java The term "RTTI" is a C-specific term referring to the functionality of the core language that allows the…

视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户反馈&#xff0c;项目现…

iOS苹果APP签名更新包与已安装应用的签名不一致的原因及解决方法

大家好我是咕噜美乐蒂&#xff0c;很高兴又和大家见面了&#xff01; iOS苹果APP签名更新包与已安装应用的签名不一致可能出现的原因主要有以下几点&#xff0c;同时给出相应的解决方法&#xff1a; 原因&#xff1a; 1.开发者证书不一致&#xff1a; 更新包使用了与之前应用…

2.7、创建列表(List)

概述 列表是一种复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、…

LeetCode 面试经典150题 392.判断子序列

题目&#xff1a; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"…

基于深度学习的OCR,如何解决图像像素差的问题?

基于深度学习的OCR技术在处理图像像素差的问题时确实面临一定的挑战。图像像素差可能导致OCR系统无法准确识别文本&#xff0c;从而影响其精度和可靠性。尽管已经有一些方法如SRN-Deblur、超分SR和GAN系列被尝试用于解决这个问题&#xff0c;但效果并不理想。然而&#xff0c;这…

安防监控视频汇聚平台EasyCVR在银河麒麟V10系统中的启动异常及解决方法

安防监控视频平台EasyCVR具备较强的兼容性&#xff0c;它可以支持国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台兼容性强&#xff0c;支持Windows系…

BVH2SMPL 实战笔记

目录 渲染npy 初始化smpl模型: 骨骼运动转motion motion结构: BVH2SMPL-main 渲染npy rendering.py self.npy_path = npy_pathself.motions = np.load(self.npy_path)self.rot2xyz = Rotation2xy

容器镜像加速指南:探索 Kubernetes 缓存最佳实践

介绍 将容器化应用程序部署到 Kubernetes 集群时&#xff0c;由于从 registry 中提取必要的容器镜像需要时间&#xff0c;因此可能会出现延迟。在应用程序需要横向扩展或处理高速实时数据的情况下&#xff0c;这种延迟尤其容易造成问题。幸运的是&#xff0c;有几种工具和策略…

爬虫工作量由小到大的思维转变---<第五十七章 Scrapy 降维挖掘---中间件系列(6)>

前言: 继续上一篇:https://hsnd-91.blog.csdn.net/article/details/136978761 我们继续将探讨Scrapy框架中的三个重要中间件&#xff1a;HTTP压缩中间件、重定向中间件和Cookie中间件。 首先&#xff0c;HTTP压缩中间件&#xff08;HttpCompressionMiddleware&#xff09;能…

政安晨:【TensorFlow与Keras实战演绎机器学习】专栏 —— 目录

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本篇是作者政安晨的专栏《TensorFlow与Keras…

获取CPLEX求解MIP时添加的cutting planes (C program)

源代码&#xff1a;https://www.ibm.com/support/pages/sample-c-program-retrieve-cuts-added-cplex-during-mip-optimization 通过macOS的终端&#xff08;terminal&#xff09;编译&#xff1a; CPX_PATH /Applications/CPLEX_Studio_Community2211/cplex/ CC g ARCH x…

文献阅读笔记(Transformer)

文献阅读笔记&#xff08;Transformer&#xff09; 摘要Abstract1、文献阅读1.1 文献题目1.2 文献摘要1.3 研究背景1.4 模型架构1.4.1 Encoder-Decoder1.4.2 注意力机制1.4.3 多头注意力1.4.4 Position-wise Feed-Forward Networks1.4.5 Embeddings and Softmax1.4.6 Positiona…

重构文件上传行为

目标&#xff1a;将 [前端 → 后端] 改成 [前端 → 中间层 → 后端] 第一步&#xff1a;自定义上传行为&#xff08;ElementPlus&#xff09; <template><el-uploadaction""show-file-listv-model:file-list"fileList":on-change"handleCha…

UnoCSS实现背景图片样式加载

UnoCSS是一个好东西&#xff0c;可以把任何style样式通过css去描述。但是默认使用的tailwindcss有一个不完美&#xff0c;就是当使用图片时&#xff0c;背景图片无法通过原子化css直接描述。例如有一个背景图片&#xff0c;则必须为该图片单独出一个css样式&#xff0c;然后再加…

大小端字节序和字节序的判断+有符号整形和无符号整形的取值范围

大小端存在的意义 大小端字节存储方式&#xff08;Big-Endian 和 Little-Endian&#xff09;的存在主要是由于不同计算机体系结构和网络通信标准对数据表示方式的差异所导致的。大小端字节存储方式的存在具有以下意义&#xff1a; 1. 兼容性&#xff1a;不同的计算机系统和网络…

自定义对外开放接口的加解密和签名、验签

背景 公司需要对外开放接口&#xff0c;因此需要进行签名和验签。所以&#xff0c;自定义了一个签名和验签规则。 具体实现 1.定义抽象类 <?phpnamespace App\Library\Signature;abstract class AbstractSecret {/*** 对接ID* var string*/protected $appId ty808732;…