练习8-8 移动字母(10 分)[C语言] 反醒自己
习题8-6 删除字符 (20分)
本题要求实现一个删除字符串中的指定字符的简单函数。
函数接口定义:
void delchar( char *str, char c );
其中char *str
是传入的字符串,c
是待删除的字符。函数delchar
的功能是将字符串str
中出现的所有c
字符删除。
题目就是上面写的。
相关参考来源与:
https://blog.csdn.net/dreampinguo/article/details/81141043
https://www.cnblogs.com/samgue/p/13246355.html
主要的目的为删除指定的字符,给你一个指针进行操作。先上两种常规逻辑的代码,就是查询是否碰到指定的字符,碰到的话,对后续的元素重新移位。这个时间复杂都我觉得有n的平方左右。
#include <string.h> void delchar( char *str, char c ){ int n=strlen(str); for(int i=0;i<n;i++){ while(str[i]==c){ for(int j=i;j<n;j++){ str[j]=str[j+1]; } } } }
上面的是正向查询,碰到的话,起一个for循环进行将后面的替换,这个while用的很不错,能够解决连续出现重复代码的情况,我自己的话,也想到了移位,但没有想到需要新开一个for循环,将后续的全部移好,再做下一轮判断,而且这个while用的特别好,我前面一直想,这个while根本不会退出啊。
void delchar( char *str, char c ) { int i,j,t=1; for(i=MAXN-1;i>=0;i--) { if(str[i]==c) { for(j=i;j<MAXN-t;j++) { str[j]=str[j+1]; } t++; } } }
这是第二种从后面往前判断的写法,总体逻辑差不多。
void delchar( char *str, char c ) { int i,j,t=1; for(i=MAXN-1;i>=0;i--) { if(str[i]==c) { for(j=i;j<MAXN-t;j++) { str[j]=str[j+1]; } t++; } } }
这是最后一种反向的思考,如果碰到相同的时候,我只需要不操作既可,通过两个索引进行操作。思路确实很可以。
void delchar( char *str, char c ) { int k=0; for(int i=0;str[i];i++) { if(str[i]!=c)str[k++]=str[i]; } str[k]=0; }
这个确实要快很多,时间复杂度为n,确实很厉害。
这个题目我想了两个小时,还是最后通过网络查询查到的答案,看来我不仅数学差,而且算法能力确实非常差,脑子笨的可以。
这次学习C语言过程中碰到的一些算法以及逻辑,确实让我对指针有了更加深入的了解。C语言作为语言之首,确实指针有非常的过人之处。
非常喜欢这门语言,指针的使用,让我感觉,原来很多想法可以这么操作。
脑子是个好东西,前面几十年一直没咋动起来,生锈了,不知道后续的学习,这个笨脑子能不能跟上。