字符串面试题系列之三:左旋转字符串
2013-08-06 17:43
183 查看
前言
在这里说明一下,本系列文章所提供的算法均在Federa 8 系统上编译通过并且编译通过。如果有问题或者纰漏或者有好的建议更或者有更好的算法,请不吝赐教。言归正传,这是字符串的第三个算法叫左旋字符串。
正文
左旋字符串,咋一看也许不 太明白是什么意思。其实有点类似于循环左移的概念。字符串的第一个字符移动到字符串末尾,就像一个环一样。比如abc,左旋一位便是bca。解释就到这里。下面给出题目:
【题目】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 【例子】字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
【分析】对于这一道题来讲,我们应该如何来思考呢?直观的想,显然是开辟一块相同的内存,然后将左旋的几位数字复制到新开辟的数组后面,然后依次将剩下的字符复制到新数组里。返回新数组。
但是,这里要求辅助内存是O(1), 也就是说,我们只能不能按照上面的方法去求。那又如何呢?
不知道小伙伴们是否还记得系列之一的颠倒字符串,好吧,其实本题可以借助这样一种思路来达到目的。因为采用的是交换的方式。所以符合内存要求。我们来如何做呢?
基于这个想法,我们就有了初步的算法思路了。接下来我就就一步一步来写下这个算法的过程。
第一步:对整个字符串逆转;
第二步:分别逆转两个子字符串(两个子字符串是题目告诉我们的,就是基于左旋多少位来计算的,这个很简单吧);
第三步:我们完成得到的目标字符串了。
基于上面的文字思路基础上,我们写下如下的code:
#include <iostream> #include <cstring> char * string_levorotation( char * const string, int pos, int length ) { int start = 0; int end = start + pos - 1; char ch; if( 1 == length || 0 == pos ) { return string; } // reverse substring from 0 to pos-1 while( start < end ) { ch = string[start]; string[start] = string[end]; string[end] = ch; start ++; end --; } // reverse substring from pos to the last start = pos; end = length - 1; while( start < end ) { ch = string[start]; string[start] = string[end]; string[end] = ch; start ++; end --; } // reverse the whole string start = 0; end = length - 1; while( start < end ) { ch = string[start]; string[start] = string[end]; string[end] = ch; start ++; end --; } return string; } int main( int argc, char ** argv ) { char string[] = "abcdef"; char * pResult = string_levorotation( string, 2, strlen(string) ); std::cout << pResult << std::endl; return 0; }
[code]
总结
我们输入字符串abcdef,得到的结果如下:作者:Alex
出处:http://blog.csdn.net/hellotime
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- 字符串面试题系列之三:左旋转字符串
- 剑指Offer系列-面试题42:翻转单词顺序和左旋转字符串
- 【我解C语言面试题系列】011 删除指定字符串的相应字符
- 剑指Offer系列-面试题8:旋转数组的最小数字
- 【C语言】【笔试题】【面试题】判断一个字符串是否为另外一个字符串旋转之后的字符串
- 程序员面试题精选100题(21)-左旋转字符串
- 面试题42 左旋转字符串
- 经典面试题:求数组的最大子序列和;实现函数 :判断一个自负喜欢是否是另一个字符串旋转所得;杨氏矩阵中查找一个数。
- 面试题42:翻转单词顺序VS左旋转字符串
- 算法中字符串系列之旋转字符串
- 【我解C语言面试题系列】011 删除指定字符串的相应字符
- JAVA面试题解惑系列(六)——字符串(String)杂谈 转载自javaeye
- 字符串面试题系列之四:字符串匹配
- 剑指offer-面试题42-翻转单词顺序VS左旋转字符串
- 剑指offer-面试题42:翻转单词顺序VS左旋转字符串
- 剑指Offer面试题42(Java版):反转单词顺序VS左旋转字符串
- 剑指Offer_面试题42_翻转单词顺序 VS 左旋转字符串
- 腾讯面试题--字符串旋转
- 面试题46:翻转单词顺序VS左旋转字符串
- 【剑指offer】6.3知识迁移能力——面试题42:翻转单词顺序VS左旋转字符串