面试100 21左旋转字符串

面试100 21左旋转字符串

      21左转字符串

  一 问题描述
        对字符串进行左旋转操作,比如字符串为 cdefab ,执行左旋转2操作之后,字符串变为efabcd 。要求使用o(n)的时间复杂度 和o(1)的空间完成。
       考虑之前实现的字符串中单词翻转问题 I am a student. 问题设单词划分为AB 两部分 ,则BA = (AT BT)T。
        即先对A部分逆转,再对B部分逆转,最后再对上述中间结果,进行逆转 。
 二 代码描述
      

#include  < iostream >
 
using   namespace  std ;
  
  
void  reverse( char   *  l ,  char   *  h)  // 实现逆转 
   {
      
if(l == 0 || h == 0)
        
return ;
         
       
while(l < h)
       
{
        swap(
*l ,*h) ;
          l
++ ;
          h
-- ;       
       }

       
  }

  
  
void  leftreverse( char   *  s,  int  k ,  int  n)
  
{
       
if(k > n )
         
return ;
       
char * t = s + k - 1;
       
       
char * end = s + n -1 ;
       
       reverse(s , t) ;
       reverse(t 
+ 1 , end) ;
       reverse(s , end) ;
       
       
  }

  
  
int  main()
  
{
    
char s[100= "dsadsda" ; //char *s 为字符串常量 
    leftreverse(s , 3 , strlen(s)) ;
    cout
<<s<<endl;
    system(
"pause") ;
    
return 0 ;    
  }



 

你可能感兴趣的:(面试100 21左旋转字符串)