题目难度:简单
考察内容:字符串
题目内容:对于一个给定的字符序列 S,请你把其循环左移 K 位后的序列输出(保证 K 小于等于 S 的长度)。例如,字符序列S=”abcXYZdef”,要求输出循环左移 3 位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
题目分析:可以将字符串看成两段,然后交换一下位置即可,如图
如何实现这个操作呢,下面给出两种做法
算法1:
先定义一个字符串,遍历两遍str,第一遍将后一段加入,第二遍将第一段加入即可
代码如下
class Solution { public: string LeftRotateString(string str, int n) { if (n > str.size()) return str; //return str.substr(n)+str.substr(0,n); string s; //定义转换后的字符串 for(int i=n;i<str.size();i++) s.push_back(str[i]); //第一次遍历加入后一段 for(int i=0;i<n;i++) s.push_back(str[i]); //第二次遍历加入前一段 return s; //返回答案 } };
算法2
直接调用stl里面的substr即可完成字符串截取操作
substr有两个参数,第一个定义从什么位置开始截取,第二个参数是截取的长度,第二个参数为空时时截取到最后
代码一行非常简洁
class Solution { public: string LeftRotateString(string str, int n) { if (n > str.size()) return str; /return str.substr(n)+str.substr(0,n); } };
时间复杂度O(n)
空间复杂度O(n)
上面两种做法本质上是一样的,后一种是用stl直接实现的