练习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语言作为语言之首,确实指针有非常的过人之处。

非常喜欢这门语言,指针的使用,让我感觉,原来很多想法可以这么操作。

脑子是个好东西,前面几十年一直没咋动起来,生锈了,不知道后续的学习,这个笨脑子能不能跟上。

原文地址:https://www.cnblogs.com/sidianok/p/15291487.html