您的位置:首页 > 理论基础 > 计算机网络

多益网络2014校招的一道笔试题---左旋字符串

2014-05-07 23:37 239 查看
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数,分析算法复杂度

当时答的时候用的方法太渣了,

思路是每次左移一位,移动K次。

12345678→23456781→34567812→45678123

这是我写的实现代码

void LeftMove(char* str,int k,int n)
{
k = k%n;
if (NULL == str||k<1||n<1)
{
return;                     //输出合法性检测
}
while(k--)
{
int t = str[0];
for(int i=1;i<n;i++)
{
str[i-1] = str[i];
}
str[n-1] = t;
}
}


虽然这个算法可以实现数组的循环右移,但是算法复杂度为O(n^2)

后面在别人博客上看见一种比较简单有效而且复杂度比较好的方法---逆序

假设我要移动“12345678”的3位,我可以将字符串分为123,45678两部分

逆序排列123:321

逆序排列45678:87654

全部逆序32187654:45678123

这样也实现了左旋3位数

这是我实现的代码,已测试正确

char *Reverse(char *first,char *end)             //逆序first指针到end指针之间的字符
{
char *temp =first;
if (first>=end||NULL==first||NULL==end)
{
return temp;
}
while (first<end)
{
swap(*first++,*end--);
}
return temp;
}
void swap(char&a,char&b)
{
char temp = a;
a = b;
b = temp;
}
char* LeftMove(char *str,int len,int n)             //左旋函数
{
if (NULL==str||n<0)
{
return str;
}
n = n%len;
Reverse(str,str+n-1);
Reverse(str+n,str+len-1);
Reverse(str,str+len-1);
return str;
}


算法复杂度为O(n)

总之还得再继续努力,特别是在数据结构和算法要下工夫,这样下一次笔试就能胸有成竹了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: