C#实现字符串左旋转操作
竞赛题目及要求:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。
要求:对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。
思路:
如需对一个字符串“abcdef”进行前2个字符左旋转操作,将字符串“abcdef”分成两部分,“ab”和“cdef”,分别对“ab”和“cdef”进行反转操作,“ab”-->"ba","cdef"-->"fedc", 之后合并组成一个“bafedc”的字符串,再将“bafedc”进行发转操作,“bafedc”-->"cdefab","cdefab"就是“abcdef”左旋转两位的结果。
代码实现:
static void roll(StringBuilder strBuilder,int index,int n) { for (int i = 0; i < n/2; i++) { char temp = strBuilder[index+i]; strBuilder[index+i] = strBuilder[index+n-i-1]; strBuilder[index+n-i-1] = temp; } } /** * 对字符串str前index个数进行左旋转操作 **/ static void leftRotate(StringBuilder str,int index) { if (str.Length < index) { Console.WriteLine("所要旋转的字符串个数大于字符串总个数"); return; } roll(str, 0, index); roll(str, index, str.Length - index); roll(str, 0, str.Length); }