博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【编程题目】左旋转字符串 ☆
阅读量:4633 次
发布时间:2019-06-09

本文共 1349 字,大约阅读时间需要 4 分钟。

26.左旋转字符串(字符串)

题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串 abcdef 左旋转 2 位得到字符串 cdefab。请实现字符串左旋转的函数。
要求时间对长度为 n 的字符串操作的复杂度为 O(n),辅助内存为 O(1)。

 

思路:

设字符串为 abcdefg 要左旋两个, $$表示操作范围,|表示要旋转的轴线,将操作范围分为两个部分。每次把范围小的部分与范围大的部分的靠近|的位置交换。范围相同则直接交换。

1. $ab|cdefg$

      2     5

2. cd$ab|efg$

          2    3

3. cdef&ab|g&

             2 1

4. cdef&a|g&b

           1   1

5. cdefgab       完成。

代码用的递归实现。但是我不知道我用了循环中的int i和一些辅助的变量。是不是不符合辅助空间O(1)的要求了?

#include 
#include
void swap(char * c1, char * c2){ char c = *c1; *c1 = *c2; *c2 = c;}void exchange(char * s1, char * s2, int n){ for(int i = 0; i < n; i++) { swap(s1,s2); s1++; s2++; }}void rotate(char * in, int n, int len){ n = n % len; //判断左旋字符数是否超过字符串长度 int l = n, r = len - l; if(l < r) { len -= l; exchange(in, in + l, l); rotate(in + l, l, len); } else if(l > r) { exchange(in + len - r, in + len - 2 * r, r); len -= r; rotate(in, len - r, len); } else { exchange(in, in + l, l); }}void leftrotate(char * in, int n){ rotate(in, n, strlen(in));}int main(){ char s[] = "abcdefghi"; leftrotate(s, 10); return 0;}

 

网上有个很巧妙的思路:

分析:如果将字符串分为AB两部分,其中A表示要移动到字符串尾部的字符串,B表示剩余部分,我们先分别将A和B逆置,然后再将字符串作为一个整体来逆置,这样起到的效果是第一步先得到ATBT,然后得到(ATBT)T,即BA。

 

网上有STL的讲解,还没看

 

转载于:https://www.cnblogs.com/dplearning/p/3976439.html

你可能感兴趣的文章
神奇的FireFox
查看>>
【Redfin SDE intern】跪经
查看>>
c++函数overload 的歧义匹配
查看>>
ROM vs RAM
查看>>
mysql中sql语句
查看>>
head/tail实现
查看>>
sql语句的各种模糊查询语句
查看>>
vlc 学习网
查看>>
Python20-Day05
查看>>
Real World Haskell 第七章 I/O
查看>>
C#操作OFFICE一(EXCEL)
查看>>
【js操作url参数】获取指定url参数值、取指定url参数并转为json对象
查看>>
ABAP 程序间的调用
查看>>
git分支管理
查看>>
移动端单屏解决方案
查看>>
一位资深Java架构师的晋级心得
查看>>
ass1_1
查看>>
senfile函数实例的运行过程截图
查看>>
程序编辑SHP文件并应用更改到数据源
查看>>
VS中C#读取app.config数据库配置字符串的三种方法(转)
查看>>