【编程题目】左旋转字符串 ☆
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
【编程题目】左旋转字符串 ☆相关推荐
- 程序员编程艺术(算法卷):第一章、左旋转字符串
第一章.左旋转字符串 作者:July,yansha. 时间:二零一一年四月十四日. 说明:(狂想曲,有三层意思:1.思绪纷飞,行文杂乱无章,想到什么,记下什么.2.简单问题深入化,复杂问题精细化,不惧 ...
- 题目1362:左旋转字符串(Move!Move!!Move!!!)
题目1362:左旋转字符串(Move!Move!!Move!!!) 时间限制:2 秒 内存限制:32 兆 特殊判题:否 提交:2306 解决:961 题目描述: 汇编语言中有一种移位指令叫做循环左移( ...
- 402-字符串(题目:剑指Offer58-II.左旋转字符串、 28. 实现 strStr()、459.重复的子字符串)
题目:剑指Offer58-II.左旋转字符串 class Solution {public:string reverseLeftWords(string s, int n) {string s1(s. ...
- [剑指offer]面试题42:翻转单词顺序 VS左旋转字符串
面试题42:翻转单词顺序 VS左旋转字符串 题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a st ...
- 代码随想录算法训练营第08天 | LeetCode 344.反转字符串,541. 反转字符串2,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串
LeetCode [344. 反转字符串] 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须**原地修改输入数组**. ...
- 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串
一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...
- 微软算法100题26 左旋转字符串
26.左旋转字符串 题目: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef 左旋转2 位得到字符串cdefab.请实现字符串左旋转的函数. 要求时间对长度 ...
- 《剑指offer》-- 和为S的连续整数序列、和为S的两个数字、左旋转字符串、翻转单词顺序列
一.和为S的连续整数序列: 1.题目: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100 ...
- 剑指offer之左旋转字符串
1 题目 字符串的左旋转操作是把字符串前面的若干字符转移到字符串尾部,比如字符串abcdef和数字2,函数返回左旋转得到的结果是cdefgab 2 思路 先反转字符串所有,通过数字n找到的边界 ,然后 ...
最新文章
- Shell函数详解(函数定义、函数调用)
- Java Longest Palindromic Substring(最长回文字符串)
- java中week of year_Java WeekFields weekOfYear()用法及代码示例
- C#调用C++类(以COM组件的形式)
- MTK平台环境搭建---Ubuntu Linux 下执行sudo apt-get install提示“现在没有可用的软件包……...
- java 自动下载自动搜索_360搜索彩蛋自动化开发实践
- 在Ruby中,如何跳过.each循环中的循环,类似于‘continue‘[duplicate]
- 在 vb.NET 中使用 COM+ 服务
- python 保存dataframe_在python2中将dataframe保存到CSV
- 周志华《机器学习》课后习题(第六章):支持向量机
- 《原则》瑞达利欧_epub+mobi+azw3
- “抖音群控系统”教你如何抓住短视频时代风口,进行流量红利变现
- 当积分墙揭开神秘面纱,还剩什么?
- 网络负载均衡器(NLB)
- ADF11g-041:禁止或允许其它网站添加ADF页面到iframe中
- SYSLINUX 6.03不支持64bit的ext4
- ThreadFactory线程工厂
- Android 安卓超级简单 修改图片RGB颜色,实现图片冷暖色变化
- Git SSH 方式无法 push 踩坑
- AtCoder Beginner Contest 126