题目:实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
代码如下:
方法一:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#pragma warning(disable:4996)
static leftMoveCore(char *str, int len)
{
char tmp = str[0];
int i = 0;
for (; i<len - 1; i++)
{
str[i] = str[i + 1];
}
str[i] = tmp;
}
void leftMove(char*str, int len, int count)
{
assert(str);
assert(len>0);
assert(count>0);
count %= len;
while (count--)
{
leftMoveCore(str, len);
}
}
int main()
{
int count = 0;
printf("please input a number:");
scanf("%d",&count);
char arr[] = "abcd1234";//不能写成*str
int len = sizeof(arr) / sizeof(arr[0])-1;
printf("before move:%s\n",arr);
leftMove(arr,len ,count);
printf("after move: %s\n",arr);
system("pause");
return 0;
}
方法二:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#pragma warning(disable:4996)
static void reverseStr(char*start, char*end)
{
while (start < end)
{
*start ^= *end;
*end ^= *start;
*start ^= *end;
start++;
end--;
}
}
void leftMove(char*str, int len, int count)
{
assert(str);
assert(len>0);
assert(count > 0);
count %= len;
reverseStr(str, str + count - 1);
reverseStr(str + count, str + len - 1);
reverseStr(str, str + len - 1);
}
int main()
{
int count = 0;
printf("please input a number:");
scanf("%d",&count);
char arr[] = "abcd1234";//不能写成*str
int len = sizeof(arr) / sizeof(arr[0])-1;
printf("before move:%s\n",arr);
leftMove(arr,len ,count);
printf("after move: %s\n",arr);
system("pause");
return 0;
}
方法三:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#pragma warning(disable:4996)
static void reverseStr(char*start, char*end)
{
while (start < end)
{
*start ^= *end;
*end ^= *start;
*start ^= *end;
start++;
end--;
}
}
void leftMove(char*str, int len, int count)
{
assert(str);
assert(len>0);
assert(count > 0);
count %= len;
int newsize = 2 * len + 1;
char*mem = (char*)malloc(sizeof(char)*newsize);
strcpy(mem,str);
strcat(mem,str);
strncpy(str,mem+count,len);
free(mem);
}
int main()
{
int count = 0;
printf("please input a number:");
scanf("%d",&count);
char arr[] = "abcd1234";//不能写成*str
int len = sizeof(arr) / sizeof(arr[0])-1;
printf("before move:%s\n",arr);
leftMove(arr,len ,count);
printf("after move: %s\n",arr);
system("pause");
return 0;
}