编程珠玑--左旋字符串

其实编程之美也有类似的题,这道题是编程珠玑第二章的题目。

题目描述:给定一个字符串,将字符串循环移位K次。

最简答的方法就是,通过O(n)的辅助空间,将数组循环移位,时间复杂度就是O(n)

但是如果要求空间复杂度为O(1)呢?

观察规律可知,对前K位反转以及后面的反转,最后对整个字符串反转就能达到O(1)的空间复杂度。

PS:注意处理k>字符串的长度的情况


 1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 void reverseStr(string &s,int i,int j)
7 {
8 while(i < j)
9 {
10 char tmp = s[i];
11 s[i] = s[j];
12 s[j] = tmp;
13 ++i;
14 --j;
15 }
16 }
17
18 void leftRotate(string &s,int k)
19 {
20 int len = s.length();
21 k = k%len;
22 reverseStr(s,0,k-1);
23 reverseStr(s,k,len-1);
24 reverseStr(s,0,len-1);
25 }
26
27 int main()
28 {
29 string s("abcdefgh");
30 leftRotate(s,3);
31 cout<<s<<endl;
32 return 0;
33 }

时间: 2024-08-05 20:01:06

编程珠玑--左旋字符串的相关文章

编程珠玑字符串反转

编程珠玑真是一本让人感觉到眼前一亮的书,虽然书不厚,但是里面的知识很贴近实际应用,也很有启发性,如果能真正的消化里面的内容,对程序的理解肯定会上一个档次. 本文给出的是第二章习题的第五题的大概程序! #include<iostream> using namespace std; void move(int * arr, int arrsize,int n);//将数组arr的前n个元素左移 void show(int * arr,int arrsize); void reverse(int *

《编程珠玑》高清pdf版

下载地址:网盘下载 作者简介 编辑 Jon Bentley是位于新泽西州Murray Hill的朗讯贝尔实验室计算机科学研究中心的技术委员会委员,Jon自1998年就成为Dr. Dobb's Joumal杂志的特约编辑,他的"编程珠玑"专栏多年来一直是顶级学术杂志Communications of the ACM最风行的特色专栏之一,而本书正是建立在这些专栏的基础之上. 目录 编辑 第一部分 基础 第1章 开篇 1.1 一次友好的对话 1.2 准确的问题描述 1.3 程序设计 1.4

一维向量旋转算法 编程珠玑 第二章

看了编程珠玑第二章,这里面讲了三道题目,这里说一下第二题,一维向量旋转算法. 题目:将一个n元一维向量(例数组)向左旋转i个位置. 解决方法:书上讲解了5种方法,自己只想起来2种最简单方法(下面讲的前两种). 1.原始方法. 从左向右依次移动一位,对所有数据平移:这样循环i次,算法最坏时间复杂度达n^2.耗时不推荐. 2.空间换时间. 顾名思义,申请一个i长度的空间,把前i半部分放到申请空间中,再把后面的所有数据向左移动i个位置,最后把申请的空间中的数据放到后半部分.浪费空间,不推荐. 3.杂技

《编程珠玑》第一章

一.题目: 如何在1MB的空间里面对一千万个整数进行排序?并且每个数都小于1千万.实际上这个需要1.25MB的内存空间(这里所说的空间是考虑用位图表示法时,每一位代表一个数,则1千万/(1024*1024*8) 约为1.25MB  ). 1MB总共有838,8608个可用位.所以估计也可以在1MB左右的空间里面进行排序了. 分析: 1)基于磁盘的归并排序(耗时间) 2)每个号码采用32位整数存储的话,1MB大约可以存储250 000 个号码,需要读取文件40趟才能把全部整数排序.(耗时间) 3)

编程珠玑第二章

编程珠玑第二章 A题 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中一32位整数. 1.在文件中至少存在这样一个数? 2.如果有足够的内存,如何处理? 3.如果内存不足,仅可以用文件来进行处理,如何处理? 答案: 1.32位整数,包括-2146473648~~2146473647,约42亿个整数,而文件中只有40亿个,必然有整数少了. 2.如果采用位数思想来存放,则32位整数最多需要占用43亿个位.约512MB的内存空间. 可以采用前一章的位处理方法.然后判断每个in

《编程珠玑》阅读小记(1)— 开篇

1. 前言 久闻<编程珠玑>一书的大名,一直没有找到合适的机会深入学习阅读,最近终于得以入手,便决心投入细细的研究,提升一下自己的编程思想与技术.阅读之后才发现,这本书确实一本不可多得的好书.它以计算机领域应用与编程算法相结合,让读者面对实际问题时,不单单局限于考虑该问题的解决方案,而是在入手实践之前能够驻足于考虑,该方案是否符合当前的实际环境,它的时间与空间的消耗是否达到了一个比较好的指标. 通过阅读这本书,很大程度上拓宽了我这样一个菜鸟程序员的视野.对于我来讲,发现要想真正的对书中内容有所

【编程珠玑】【第二章】编程求解组合问题

组合问题 以下两个题目是等价的: 题目1:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有空.a.b.c.ab.ac.bc.abc. 题目2:打印一个集合所有的子集和,比如{a,b,c}的子集和有{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}以及空集{}. 方法一.递归求解给定集合的全组合n!. 之前我们讨论了如何用递归的思路求字符串的全排列,同样,本题也可以用递归的思路来求字符串的全组合. 1.算法思路: 具有三个元素的集合{a,b

【编程珠玑】【第二章】问题C

变位词(anagrams):指的是组成两个单词的字符相同,但位置不同的单词.比如说,abbcd和abcdb就是一对变位词.在介绍问题c之前,我们先看看如何判断两个字符串是否是变位词. 分析:求解题目C有两种思路: [思路一] 由于变位词只是字母的顺序改变,字符长度,字符种类没有改变,所以根据此我们只要重新根据字典序排序一下,两个字符串也就一样了.如abcbd和acdbb是一对变位词,按照字典序排序之后他们都变成了abbcd.这种方法的时间效率根据你使用的排序算法不同而不同,基于比较的排序的时间复

【编程珠玑】【第二章】问题B

问题B:将一个n元一维向量向左旋转i个位置.例如,当n = 8且i = 3时,向量abcdefgh旋转为defghabc. 方法一.使用一个字节的额外空间开销. 采用每次向左移一位的方法,循环i次.当然也可以使用向右移动的方法,循环length - i次.以向左移动为例,共需要移动i趟,首先把str[0]赋值给临时变量temp,剩余的字符向左移动一位,即str[k]=str[k+1],移动完成后把临时变量temp赋值给str[n-1]. 该方法比较笨,但是也是最容易想到的,它空间开销小,但是时间