题目:
解法1:
设计循环使其可以旋1次,然后让他执行n次是一个最简单的思路:
void fun(char *s,int k)
{
char tmp = 0;
int len = sizeof(s) / sizeof(s[0]);
int time = k%len;
//长度为5的情况下,旋转6、11、16...次相当于1次,7、12、17...次相当于2次,以此类推。
for (int i = 0; i < time; i++)
{
tmp = s[0];
int j = 0;
for (j = 0; j <len-1; j++)
{
s[j] = s[j + 1];
}
s[j] = tmp;
}
}
int main()
{
char str[100] = { '\0' };
scanf("%s", str);
int k = 0;
scanf("%d", &k);
fun(str, k);
printf("%s", str);
return 0;
}
解法2:
可以选择拼接法,一次到位:
//左旋函数代码
void leftRound(char * src, int time)
{
int len = strlen(src);
int pos = time % len; //断开位置的下标
char tmp[256] = { 0 }; //更准确的话可以选择malloc len + 1个字节的空间来做这个tmp
strcpy(tmp, src + pos); //先将后面的全部拷过来
strncat(tmp, src, pos); //然后将前面几个接上
strcpy(src, tmp); //最后拷回去
}
解法3:
先将要左旋的前三个家伙逆序(CBADEFG),然后将后半段也逆序(CBAGFED),最后整体逆序(DEFGABC)即可。这样只需要做数值交换即可,可以写一个函数帮我们完成局部逆序,代码如下:
void reverse_part(char *str, int start, int end) //将字符串从start到end这一段逆序
{
int i, j;
char tmp;
for (i = start, j = end; i < j; i++, j--)
{
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
void leftRound(char * src, int time)
{
int len = strlen(src);
int pos = time % len;
reverse_part(src, 0, pos - 1); //逆序前段
reverse_part(src, pos, len - 1); //逆序后段
reverse_part(src, 0, len - 1); //整体逆序
}