字符串面试题系列之五:删除字符串空格

编译环境

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

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

前言

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

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

正文

【题目】

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

【例子】

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

【分析】

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

8

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

【代码】

#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 != '\0' )
   {
      if( *p != ' ' )
      {
         string[j++] = *p;
      }
      else
      {
         while( *p == ' ' )
         {
            p++;
         }
         string[j++] = ' ';
         p--;
      }
      p++;
   }
   string[j] = '\0';
   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 code

   本文版权归做者全部,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。 blog

相关文章
相关标签/搜索