微软面试题——反转字符串 【转】

这是网络流传的Microsoft的面试题目之一:“编写反转字符串的程序,要求优化速度、优化空间”。因为最近一直很多关注算法方面的实践和研究,因此对这个问题进行了一些思考,给出了5种实现方法(有两种解法相关性比较大)。

解法一:第一次看到这题目,想到最简单、最直觉的解法就是:遍历字符串,将第一个字符和最后一个交换,第二个和倒数第二个交换,依次循环,即可,于是有了第一个解法:

 

char *  strrev1( const   char *  str)
{
       
int  len  =  strlen(str);
       
char *  tmp  =   new   char [len  +   1 ];
       strcpy(tmp,str);

       for (int i = 0; i < len/2++i) {

          char c = tmp[i];

          tmp[i] = tmp[len – i - 1];

          tmp[len – i  -   1 =  c;
       }
    return  tmp;
}

上面的这种写法是没有问题,但是我们要注意,这里返回的是一个字符指针,这个指针指向的内容是反转之后的字符串。

但是我们要注意反转之后的字符串的内存空间是在堆上分配的,所以用这个函数的用户就有义务释放掉这段内存,在他

认为不需要的时候,这就增加了用户的负担,而且容易造成本来可以避免的内存泄漏。所以个人感觉这里可以在函数形参

中再增加一个参数,作为引用。

 

显然上面的两个解法中没有考虑时间和空间的优化,一个典型的优化策略就是两个字符交换的算法优化,我们可以完全不使用任何 外部变量即完成两个字符(或者整数)的交换,这也是一个很经典的面试题目。特别是一些嵌入式硬件相关编程中经常要考虑寄存器的使用,因此经常有不使用任何 第三个寄存器即完成两个寄存器数据的交换的题目。

 

char *  strrev3( const   char *  str)
{
       
char *  tmp  =   new   char [strlen(str)  +   1 ];

       strcpy(tmp,str);

       
char *  ret  =  tmp;

       
char *  p  =  tmp  +  strlen(str)  -   1 ;

       
while  (p  >  tmp) {

              
* ^=   * tmp;

              
* tmp  ^=   * p;             

              
* ^=   * tmp;

              
-- p;

              
++ tmp;

       }

       
return  ret;
}

 

 

 

转载于:https://www.cnblogs.com/NeuqUstcIim/archive/2008/12/23/1360215.html

你可能感兴趣的:(微软面试题——反转字符串 【转】)