[容易]旋转字符串

题目来源:http://www.lintcode.com/zh-cn/problem/rotate-string/

先贴一个错误的代码,通过了示例,但是没有通过全部案例:

 1 class Solution {
 2 public:
 3     /**
 4      * @param str: a string
 5      * @param offset: an integer
 6      * @return: nothing
 7      */
 8     void rotateString(string &str,int offset){
 9         //wirte your code here
10         string s;
11         string temp;
12         s.assign(str,str.size()-offset,str.size()-1);
13         temp.append(s,0,offset);
14         temp.append(str,0,str.size()-offset);
15         str.swap(temp);
16     }
17 };

需要考虑到offset大于字符串长度的情况。加上offset=offset%str.size();之后还有问题。

没有对字符串为空的情况处理,需要再加上if(str.size()>0)的判断。

可以accept的程序如下:

 1 class Solution {
 2 public:
 3     /**
 4      * @param str: a string
 5      * @param offset: an integer
 6      * @return: nothing
 7      */
 8     void rotateString(string &str,int offset){
 9         //wirte your code here
10         if(str.size()>0)
11         {
12             offset=offset%str.size();
13             string s;
14             string temp;
15             s.assign(str,str.size()-offset,str.size()-1);
16             temp.append(s,0,offset);
17             temp.append(str,0,str.size()-offset);
18             str.swap(temp);
19         }
20     }
21 };

可以Accept的正确程序2:

 1 class Solution {
 2 public:
 3     /**
 4      * @param str: a string
 5      * @param offset: an integer
 6      * @return: nothing
 7      */
 8     void rotateString(string &str,int offset){
 9         //wirte your code here
10         if (str.size()>0) {
11             offset = offset % str.size();
12             str=str.substr(str.size() - offset, offset) + str.substr(0, str.size() - offset);
13             //substr(n1,n2)下标n1开始n2个字符。
14             //用+运算符连接字符串。
15         }
16     }
17 };

可以Accept的正确程序3:

 1 class Solution {
 2 public:
 3     /**
 4      * @param str: a string
 5      * @param offset: an integer
 6      * @return: nothing
 7      */
 8     void rotateString(string &str,int offset){
 9         //wirte your code here
10         if (!str.empty()) {
11             offset %= str.length();
12             reverse(str.begin(), str.begin() + str.length() - offset);
13             reverse(str.begin() + str.length() - offset, str.end());
14             reverse(str.begin(), str.end());
15             //reverse(begin,end);反转[begin,end)区间
16         }
17     }
18 };
时间: 2024-08-07 19:51:58

[容易]旋转字符串的相关文章

1347 旋转字符串

1347 旋转字符串 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 S[0...n-1]是一个长度为n的字符串,定义旋转函数Left(S)=S[1-n-1]+S[0].比如S="abcd",Left(S)="bcda".一个串是对串当且仅当这个串长度为偶数,前半段和后半段一样.比如"abcabc"是对串,"aabbcc"则不是. 现在问题是给定一个字符串,判断他是否可以由一个对串旋转任意次得

左旋转字符串-剑指Offer

左旋转字符串 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”.是不是很简单?OK,搞定它! 思路 借助于字符串翻转,若要左旋转前n个字符串,就先翻转整个字符串,再分别翻转前n个和后面的字符 代码 public class Solution { public String Le

剑指offer系列源码-左旋转字符串

题目1362:左旋转字符串(Move!Move!!Move!!!) 时间限制:2 秒内存限制:32 兆特殊判题:否提交:1577解决:669 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abcXYZdef",要求输出循环左移3位后的结果,即"XYZdefabc".是不是很简单?OK,搞定它! 输入: 多组测试数据,每

经典算法面试题目-判断s2是否是s1的旋转字符串(1.8)

题目 Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring ( i.e., "waterbottle" is a rotation of &qu

C语言:判断一个字符串是不是另一个字符串的旋转字符串

例如:给定s1 = AABCD和s2 = BCDAA,返回1, 给定s1=abcd和s2=ACBD,返回0. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA AABCD右旋一个字符得到DAABC AABCD右旋两个字符得到CDAAB 分析题目之后我们发现,一个字符串有左旋转和右旋转两种.左旋转之后的字符串在原字符串拼接后的新字符串中:右旋转之后的字符串拼接之后可以找到源字符串. 这里我们会使用两个库函数strncat和strstr,关于两个函数的定义请自己查找. 字符

【剑指offer】左旋转字符串

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27366485 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abcXYZdef",要求输出循环左移3位后的结果,即"XYZdefabc".是不是很简单?OK,搞定它! 输入: 多组测试数据,每个测试数据包含一个

1289 大鱼吃小鱼 1305 Pairwise Sum and Divide 1344 走格子 1347 旋转字符串 1381 硬币游戏

1289 大鱼吃小鱼 有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右.游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼.从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右).问足够长的时间之后,能剩下多少条鱼? Input 第1行:1个数N,表示鱼的数量(1 <= N <= 100000). 第2 - N + 1行:每行两个数A[i], B[i],中间用空格分隔,分别表示鱼的大小及游动的方向(1 <= A[i] <= 10^9,B[i] = 0 或 1

【编程题目】左旋转字符串 ☆

26.左旋转字符串(字符串)题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部.如把字符串 abcdef 左旋转 2 位得到字符串 cdefab.请实现字符串左旋转的函数.要求时间对长度为 n 的字符串操作的复杂度为 O(n),辅助内存为 O(1). 思路: 设字符串为 abcdefg 要左旋两个, $$表示操作范围,|表示要旋转的轴线,将操作范围分为两个部分.每次把范围小的部分与范围大的部分的靠近|的位置交换.范围相同则直接交换. 1. $ab|cdefg$ 2    

编程算法 - 左旋转字符串 代码(C)

左旋转字符串 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部. 请定义一个函数实现字符串左旋转操作的功能. 编程珠玑, 首先翻转前部分, 再翻转后部分, 最后全部翻转. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio

【程序员编程艺术】学习记录1:左旋转字符串之指针翻转法

[程序员编程艺术]学习记录1:左旋转字符串之指针翻转法 题目:左旋转字符串 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab.请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(n) 思路一.暴力移位法 //暴力移位法 void leftshiftone(char *s, int n) { char t = s[0]; for(int i = 1;i < n; i++) s[i-1]