目录
要求:实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
1.暴力解法
左旋几个字符就旋转几次
首先确定旋转几次,根据下图,我们可以发现 只需要选择time=k%len(字符串长度)即可
其次将后一个覆盖前一个字符
最后将含有临时变量下标为0的赋给最后一个下标即可
void LeftRound(char* s,int len,int k)
{
int time = k % len;
for (int i = 0; i < time; i++)
{
char temp = s[0];
int j=0;
for (j = 0; j < len- 1; j++)
{
s[j] = s[j + 1];
}
s[j] = temp;
}
}
2.三段逆序法
我们要知道reverse函数,这是该方法的关键
首先将要左旋多少个的字符逆序
其次将未左旋的字符逆序
最后将前后两个整体逆序
void Reverse_part(char* s, int start,int end)
{
for (int i = start, j = end; i < j; i++,j--)
{
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
void leftRound(char* s, int time,int len)
{
Reverse_part(s, 0, time - 1); //逆序前段
Reverse_part(s, time, len - 1); //逆序后段
Reverse_part(s, 0, len - 1); //整体逆序
}
3.字符串函数拼接法
这里我们需要用到字符串函数strncat函数与strcpy函数
void leftRound(char * s, int time)
{
char tmp[256] = { 0 }; //更准确的话可以选择malloc len + 1个字节的空间来做这个tmp
strcpy(tmp, s+ time); //先将后面的全部拷过来
strncat(tmp, s, time); //然后将前面几个接上
strcpy(s, tmp); //最后拷回去
}
通过上述三种方法,我们即可实现字符串的左旋