zoukankan      html  css  js  c++  java
  • 字符串面试题系列之五:删除字符串空格

    编译环境

       本系列文章所提供的算法均在以下环境下编译通过。

    【算法编译环境】Federa 8,linux 2.6.35.6-45.fc14.i686
    【处理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
    【内存】 2025272 kB

    前言

        无论是在面试当中还是在项目当中,去除多余的空格都是十分常见的。所以面试官或者笔试当中这个题目问的还是比较多的。即字符串左边空格,右边空格,然户字符串中如果有几个空格则合并成一个空格。笔者在写一个命令行参数程序时,就觉得去除空格十分有用。比如,当用户输入一个命令及其参数的时候i,多一个空格或者多一个Tab很正常,这样解析的时候就需要对输入的字符串进行处理。这样删除字符串空格就显得十分必要了。

        本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。

    正文

    【题目】

       写一个去除字符串左边空格,右边空格,字符串中如果出现多个空格,则合并成一个空格的程序。。

    【例子】

       输入[ a b c ],则输出abc。

    【分析】

       本题思路很简单,,对字符串扫描一遍即可完成功能。怎么做的呢?好,我们考虑三个步骤,第一个步骤是去掉左边空格;第二个步骤是去掉中间空格;第三个步骤是去掉右边空格;我们让i指向字符串首地址,这个指针是专门存储字符的,用j来扫描空格。如果j指向空格,则直接跳过,如果遇到字符,就将其复制到i的位置,i指向下一个位置。对于中间的空格,j扫描,直到遇到非空格字符停止,在i的位置上加一个空格再加一个字符,这就是多个空格合并成一个空格。末尾的空格j显然都是直接忽略不计的。最后记得要新位置上要补上''噢。下图显示的就是算法的过程:

    8

    算法的文字描述如下:第一步:初始化:用i指针控制输出开始为0,j指针从0处开始扫描;
    第二步:左边空格:当j遇见第一个不是空格的字符,赋给i处.i指向下一位;
    第三步:中间以及后面空格:继续扫描,如果遇见空格则赋给i处,i指向下一位,后面空格就忽略直到下一个不是空格字符赋给i处,i指向下一位。
    第四步:给字符串加一个''并且返回。算法结束。

    【代码】

    #include <iostream>
    #include <cstring>
    
    char * del_space( char * const string )
    {
       char *p = string;
       int j = 0;
       // delete left space
       while( *p == ' ' )
       {
          p++;
       }
       // delete spaces among characters
       while( *p != '' )
       {
          if( *p != ' ' )
          {
             string[j++] = *p;
          }
          else
          {
             while( *p == ' ' )
             {
                p++;
             }
             string[j++] = ' ';
             p--;
          }
          p++;
       }
       string[j] = '';
       return string;
    }
    
    int main( int argc, char ** argv )
    {
       char string[] = "    Hello my    word !    ";
       char * result = del_space( string );
       std::cout << result << std::endl;
    }

    【结论】

    作者

       出处:http://www.cnblogs.com/gina

       本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    怎样使android的view动画循环弹动
    QQ消息99+形成--第三方开源--BezierView
    自定义Toast的显示效果
    (转载)实现QQ侧滑边栏
    图片加载与缓存利器(自动缓存)--第三方开源-- Glide
    多层级Spinner列表选项实时更新树形层级(选择城市)
    android任意view爆炸效果--第三方开源--ExplosionField
    TextView字符串波浪式跳动--第三方开源---JumpingBeans
    简单Spinner
    【前端】JavaScript入门学习
  • 原文地址:https://www.cnblogs.com/gina/p/3247169.html
Copyright © 2011-2022 走看看