左旋字符串

Details:

把字符串前面的若干个字符移动到字符串尾部,例如把 abcd 左旋转 2 位得到字符串 cdba。要求时间复杂度为 O(n),空间复杂度为 O(1)。

solution 1:step by step

void left_shift_one(char* a,int n)
{
     assert(a !=NULL);
     char m=a[0];//保存第一个字符
     for(int i=0;i<n;i++)
     {
         a[i]=a[i++];
     }
     a[n-1]=m;
}

然后向左移动k次即可

void left_shift(char*a,int n,int k){
     while(k--)
     {
        left_shift_one(a,n);
     }
}

solution 2:三步反转法

//此解法可见与《编程珠玑》
例如字符串 abcd ,若要让cd翻转到ab的前头,只要按下述3个步骤操作即可:

  1. 首先分为俩部分,X:ab,Y:cd;
  2. 将X反转,即得:ab->ba;将Y反转,即得:cd->dc。
  3. 反转上述得到的结果字符串,即badc给予反转,得cdab。
void reverse(char *a,int start,int end)
{
  while(end>start)
  {
    char t=a[start];
    a[start++]=a[end];
    a[end--]=t;
  }
}
void left_shift(char *a,int n,int m)
{
  int k=m%n;//考虑移位超过n的情况
  reverse(a,0,k-1);
  reverse(a,k,n-1);
  reverse(a,0,n-1);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,793评论 0 33
  • #1996 AHSME ##1996 AHSME Problems/Problem 1 The addition ...
    abigtreenj阅读 1,479评论 0 0
  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,397评论 0 18
  • 作为一个在接触财务工作不久的新人,在工作过程中遇到了很多问题,同样的也收益颇丰,下面就将我这一阵的学习经验来跟大家...
    亦为清心阅读 2,241评论 9 8
  • 1:24 模模糊糊的意志和清清楚楚的翻滚的疼痛。 像一锅烫着却捂着的锅。 我最终感觉到无可奈何的冰冷,爬出床晃到厕...
    tracychenxy阅读 581评论 6 4