zoukankan      html  css  js  c++  java
  • 练习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语言作为语言之首,确实指针有非常的过人之处。

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

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

  • 相关阅读:
    Oracle 10g 改机器名后监听不能启动 解决方案 TNS12541 TNS12545
    14.3.1 IMPDP 命令行选项
    14.3.2 调用IMPDP —— 导入表空间
    三十岁之前不必在乎的事
    正则表达式
    GridLayout and GridData
    非UI线程更新界面
    整理用Java实现数字转化成字符串左边自动补零方法
    stackLayout
    读写properties文件
  • 原文地址:https://www.cnblogs.com/sidianok/p/15291487.html
Copyright © 2011-2022 走看看