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

    前言

        左旋字符串,咋一看也许不 太明白是什么意思。其实有点类似于循环左移的概念。字符串的第一个字符移动到字符串末尾,就像一个环一样。比如abc,左旋一位便是bca。

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

    正文

    【题目】

       定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。

    【例子】

       字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。

    【分析】

       对于这一道题来讲,我们应该如何来思考呢?直观的想,显然是开辟一块相同的内存,然后将左旋的几位数字复制到新开辟的数组后面,然后依次将剩下的字符复制到新数组里。返回新数组。

       但是,这里要求辅助内存是O(1), 也就是说,我们只能不能按照上面的方法去求。那又如何呢?

       不知道小伙伴们是否还记得系列之一的颠倒字符串,好吧,其实本题可以借助这样一种思路来达到目的。因为采用的是交换的方式。所以符合内存要求。我们来如何做呢?

       基于这个想法,我们就有了初步的算法思路了。接下来我就就一步一步来写下这个算法的过程。

    第一步:对整个字符串逆转;
    第二步:分别逆转两个子字符串(两个子字符串是题目告诉我们的,就是基于左旋多少位来计算的,这个很简单吧);
    第三步:我们完成得到的目标字符串了。

    【代码】

    #include <iostream>
    #include <cstring>
    char * string_levorotation( char * const string, int pos, int length )
    {
       int start = 0;
       int end = start + pos - 1;
       char ch;
       if( 1 == length || 0 == pos )
       {
          return string;
       }
    
       // reverse substring from 0 to pos-1
       while( start < end )
       {
          ch = string[start];
          string[start] = string[end];
          string[end] = ch;
          start ++;
          end --;
       }
    
       // reverse substring from pos to the last
       start = pos;
       end = length - 1;
       while( start < end )
       {
          ch = string[start];
          string[start] = string[end];
          string[end] = ch;
          start ++;
          end --;
       }
    
       // reverse the whole string
       start = 0;
       end = length - 1;
       while( start < end )
       {
          ch = string[start];
          string[start] = string[end];
          string[end] = ch;
          start ++;
          end --;
       }
       return string;
    }
    
    int main( int argc, char ** argv )
    {
       char string[] = "abcdef";
       char * pResult = string_levorotation( string, 2, strlen(string) );
       std::cout << pResult << std::endl;
       return 0;
    }

    【结论】

       我们输入字符串abcdef,得到的结果如下:


    7

    作者

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

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

  • 相关阅读:
    Hadoop学习资料收集
    sed使用详解
    shell编程001
    电影《无法触碰》
    正则表达式
    I/O重定向与管道
    bash基础知识
    用户权限模型
    Linux文件管理常用命令
    根文件系统详解
  • 原文地址:https://www.cnblogs.com/gina/p/3247135.html
Copyright © 2011-2022 走看看