首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
admin
2019-03-29
114
问题
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
选项
答案
#include "string.h" /////////////////////////////////////////////////////////////////////// // Move the first n chars in a string to its end /////////////////////////////////////////////////////////////////////// char* LeftRotateString(char* pStr, unsigned int n) { if(pStr != NULL) { int nLength = static_cast
(strlen(pStr)); if(nLength > 0 || n == 0 || n > nLength) { char* pFirstStart = pStr; char* pFirstEnd = pStr + n - 1; char* pSecondStart = pStr + n; char* pSecondEnd = pStr + nLength - 1; // reverse the first part of the string ReverseString(pFirstStart, pFirstEnd); // reverse the second part of the strint ReverseString(pSecondStart, pSecondEnd); // reverse the whole string ReverseString(pFirstStart, pSecondEnd); } } return pStr; } /////////////////////////////////////////////////////////////////////// // Reverse the string between pStart and pEnd /////////////////////////////////////////////////////////////////////// void ReverseString(char* pStart, char* pEnd) { if(pStart == NULL || pEnd == NULL) { while(pStart <= pEnd) { char temp = *pStart; *pStart = *pEnd; *pEnd = temp; pStart ++; pEnd --; } } }
解析
如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分,通过旋转操作把这两个部分交换位置。于是我们可以新开辟一块长度为n+1的辅助空间,把原字符串后半部分拷贝到新空间的前半部分,在把原字符串的前半部分拷贝到新空间的后半部分。不难看出,这种思路的时间复杂度是O(n),需要的辅助空间也是O(n)。
接下来的一种思路可能要稍微麻烦一点。我们假设把字符串左旋转m位。于是我们先把第0个字符保存起来,把第m个字符放到第0个的位置,在把第2m个字符放到第m个的位置…依次类推,一直移动到最后一个可以移动字符,最后在把原来的第0个字符放到刚才移动的位置上。接着把第1个字符保存起来,把第m+1个元素移动到第1个位置…重复前面处理第0个字符的步骤,直到处理完前面的m个字符。
该思路还是比较容易理解,但当字符串的长度n不是m的整数倍的时候,写程序会有些麻烦,感兴趣的朋友可以自己试一下。由于下面还要介绍更好的方法,这种思路的代码我就不提供了。
我们还是把字符串看成有两段组成的,记位XY。左旋转相当于要把字符串XY变成YX。我们先在字符串上定义一种翻转的操作,就是翻转字符串中字符的先后顺序。把X翻转后记为X
T
。显然有(X
T
)
T
=X。
我们首先对X和Y两段分别进行翻转操作,这样就能得到X
T
Y
T
。接着再对X
T
Y
T
进行翻转操作,得到(X
T
Y
T
)
T
=(Y
T
)
T
(X
T
)
T
=YX。正好是我们期待的结果。
分析到这里我们再回到原来的题目。我们要做的仅仅是把字符串分成两段,第一段为前面m个字符,其余的字符分到第二段。再定义一个翻转字符串的函数,按照前面的步骤翻转三次就行了。时间复杂度和空间复杂度都合乎要求。
转载请注明原文地址:https://kaotiyun.com/show/OxmZ777K
0
程序员面试
相关试题推荐
[A]Theperson-skillsmatchapproachtoselection[B]Theimpactsofbadselectiondecisions[C]Theimportanceofstructu
Individualsandbusinesseshavelegalprotectionforintellectualpropertytheycreateandown.Intellectualproper【C1】______fro
输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:8/\610
C#中,stringstr=null与stringstr=””,请尽量用文字说明区别。(要点:说明详细的内存空间分配)
两个单向链表,找出它们的第一个公共结点。链表的结点定义为:structListNode{intm_nKey;ListNode*m_pNext;};
打开"记事本"应用程序。
请打开"计算器"应用程序,利用科学型模式将十六进制的ABC转换为二进制。
将D盘"试题"文件夹中的"考题1.doc"文件的属性设置为隐藏和只读。
在字体对话框中不能设置()A.字体B.字号C.字符间距D.文字样式
关于Word打印操作的正确说法是()。A.打印格式由Word控制,用户无法调整B.Word的打印过程一旦开始,在中途无法停止打印C.打印前可进行打印预览D.Word每次只能打印一份文稿
随机试题
患者,男,38岁。职员。因“进行性呼吸困难、干咳5年余,加重伴痰中带血1周”入院。查体:肺底少量湿哕音。胸部CT显示“双肺散在多发小结节影伴有树芽征及囊状支气管扩张”。肺功能提示阻塞性通气功能障碍为主。最重要的处理是
下列不属于缺血性脑血管病病因的是
女性,40岁,连续行走时两侧臀腿痛,需间歇性下蹲休息2年。开始能连续行走半小时,随后间歇期逐渐缩短,现在行走200m就出现症状,平卧时无症状。查体腰椎4~5间隙压痛,无放射,直腿抬高左右均达70°,两下肢感觉、肌力均正常。其诊断考虑为
下列不属于闻诊内容的是
A.赘述症B.幼稚言语C.模仿言语D.刻板言语E.思维散漫患者在回答问题时,机械地重复问题的答案
由于承包商的原因造成工期延误,业主进行反索赔,在确定违约金费率时,一般应考虑()因素。
关于企业价值最大化,下列说法正确的有()。
某公司从银行借款200万元,借款的年利率为11%,每年付息,到期一次性还本,筹资费用率为0.5%,企业所得税率为25%,则这笔借款的资本成本率为()。
破产企业甲公司在破产案件受理前因欠缴税款产生滞纳金。下列关于该滞纳金在破产程序中清偿顺位的表述中,符合破产法律制度规定的是()。
请在“答题”菜单中选择相应的命令,并按照题目要求完成下面的操作。注意:以下的文件必须保存在考生文件夹下。小蒋是一位中学教师,在教务处负责初一年级学生的成绩管理。由于学校地处偏远地区,缺乏必要的教学设施,只有一台配置不太高的PC可以使用。他在这台电脑中安
最新回复
(
0
)