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 <stdio.h>
#include <string.h>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;
}

网上有个很巧妙的思路:

http://blog.sina.com.cn/s/blog_60c8379d010144w9.html

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

网上有STL的讲解,还没看http://blog.csdn.net/zhoushuai520/article/details/7703368

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

【编程题目】左旋转字符串 ☆相关推荐

  1. 程序员编程艺术(算法卷):第一章、左旋转字符串

    第一章.左旋转字符串 作者:July,yansha. 时间:二零一一年四月十四日. 说明:(狂想曲,有三层意思:1.思绪纷飞,行文杂乱无章,想到什么,记下什么.2.简单问题深入化,复杂问题精细化,不惧 ...

  2. 题目1362:左旋转字符串(Move!Move!!Move!!!)

    题目1362:左旋转字符串(Move!Move!!Move!!!) 时间限制:2 秒 内存限制:32 兆 特殊判题:否 提交:2306 解决:961 题目描述: 汇编语言中有一种移位指令叫做循环左移( ...

  3. 402-字符串(题目:剑指Offer58-II.左旋转字符串、 28. 实现 strStr()、459.重复的子字符串)

    题目:剑指Offer58-II.左旋转字符串 class Solution {public:string reverseLeftWords(string s, int n) {string s1(s. ...

  4. [剑指offer]面试题42:翻转单词顺序 VS左旋转字符串

    面试题42:翻转单词顺序 VS左旋转字符串 题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a st ...

  5. 代码随想录算法训练营第08天 | LeetCode 344.反转字符串,541. 反转字符串2,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串

    LeetCode [344. 反转字符串] 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须**原地修改输入数组**. ...

  6. 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

    一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...

  7. 微软算法100题26 左旋转字符串

    26.左旋转字符串 题目: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef 左旋转2 位得到字符串cdefab.请实现字符串左旋转的函数. 要求时间对长度 ...

  8. 《剑指offer》-- 和为S的连续整数序列、和为S的两个数字、左旋转字符串、翻转单词顺序列

    一.和为S的连续整数序列: 1.题目: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100 ...

  9. 剑指offer之左旋转字符串

    1 题目 字符串的左旋转操作是把字符串前面的若干字符转移到字符串尾部,比如字符串abcdef和数字2,函数返回左旋转得到的结果是cdefgab 2 思路 先反转字符串所有,通过数字n找到的边界 ,然后 ...

最新文章

  1. Shell函数详解(函数定义、函数调用)
  2. Java Longest Palindromic Substring(最长回文字符串)
  3. java中week of year_Java WeekFields weekOfYear()用法及代码示例
  4. C#调用C++类(以COM组件的形式)
  5. MTK平台环境搭建---Ubuntu Linux 下执行sudo apt-get install提示“现在没有可用的软件包……...
  6. java 自动下载自动搜索_360搜索彩蛋自动化开发实践
  7. 在Ruby中,如何跳过.each循环中的循环,类似于‘continue‘[duplicate]
  8. 在 vb.NET 中使用 COM+ 服务
  9. python 保存dataframe_在python2中将dataframe保存到CSV
  10. 周志华《机器学习》课后习题(第六章):支持向量机
  11. 《原则》瑞达利欧_epub+mobi+azw3
  12. “抖音群控系统”教你如何抓住短视频时代风口,进行流量红利变现
  13. 当积分墙揭开神秘面纱,还剩什么?
  14. 网络负载均衡器(NLB)
  15. ADF11g-041:禁止或允许其它网站添加ADF页面到iframe中
  16. SYSLINUX 6.03不支持64bit的ext4
  17. ThreadFactory线程工厂
  18. Android 安卓超级简单 修改图片RGB颜色,实现图片冷暖色变化
  19. Git SSH 方式无法 push 踩坑
  20. AtCoder Beginner Contest 126

热门文章

  1. js中修改this的指向方法整理
  2. Java新手会遇到的三大误区,一定要避免!
  3. 前百度面试官整理的——Java后端面试题(一)
  4. 个人怎么发表期刊具体细节
  5. 约瑟夫环 猴子选大王
  6. RPC是什么?为什么要学习RPC?
  7. spring+ (activeMQ) 实现queue与topic
  8. 笔记之远程桌面服务(RDS)
  9. centos上tensorflow一键安装脚本
  10. SoapUI进行REST请求,POST方法提交到数据库的数据乱码问题