首页 > 代码库 > 微软之左旋转字符串

微软之左旋转字符串

时间:2014.04.29

地点:基地二楼

----------------------------------------------------------------------------------------------

一、题目

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。

-------------------------------------------------------------

二、思路

假设有 abcdef12345,我们想将abcdef放置12345通过左旋转放置abcdef后面

即形成 12345abcdef

我们分析:现在数子字符在前面了,字母字符在后面了,这相当于将原字符串数字部分和字母部分对换了一下

我们知道,如果分别将数字字符部分和字母字符部分逆序可形成:

fedcba和54321

我们将上面从后面往前面度,也就是说如果在将这两部分结合起来逆序就是

12345abcdef

于是归纳起来就是要写一个字符串逆转函数,先将前部分逆转,再将后部分逆转,在整体逆转

时间复杂度为O(n)

-------------------------------------------------------------

三、源码实现

#include<iostream>
using namespace std;
void Reverce(char arr[], size_t left, size_t right)
{
	char temp;
	for (;left < right;++left,--right)
	{
		temp = arr[left];
		arr[left] = arr[right];
		arr[right] = temp;
	}
}
void LeftRotationString(char arr[], size_t size, size_t count)
{
	Reverce(arr, 0, count - 1);
	Reverce(arr, count, size - 1);
	Reverce(arr, 0, size - 1);
}
int main()
{
	char arr[] = { ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘ };
	LeftRotationString(arr, 8, 3);
	for (auto e : arr)
		cout << static_cast<char>(e) << endl;
}