没有输出的输入是不完整的

0%

剑指offer-左旋转字符串

本文为剑指 offer 系列第四十二篇。
主要知识点为字符串,非常简单,都没啥值得说的。

题目描述

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

解题思路

这里其实有三种情况需要考虑,

  1. K等于字符串的长度: 这个时候可以直接返回原来的字符串。
  2. K小于字符串的长度: 这个时候相当于对于原来的字符串进行截取,一段是前面K位,一段是剩下的。然后左右置换重新拼接即可。
  3. K大于字符串的长度: 这个时候实际上相当于已经左移一圈了,继续左移实际上最后效果相当于左移
    K = K % len.
    然后该情况就变成了第二种情况。

本题目给的测试用例不是很好,或者说题目意思说的不明确,当循环左移到头之后怎么办呢?是直接返回,还是按照循环左移这个名字来真的循环呢?两种理解都可以过所有样例,感觉题目出的非常不好。

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
string LeftRotateString(string str, int n) {
int slen = str.size();
if(slen == 0) return str;
//if(slen < n) return str; // 如果左移位数超过字符串长度,直接返回,也可以过测试用例。
int realn = n%slen;
string head = str.substr(0,realn);
string tail = str.substr(realn);
return tail+head;
}
};

时间复杂度为O(n),空间复杂度为O(n)

以上,本题结束!