题目:实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
/*
1.实现左旋字符串中的k个字符
2.判断一个字符串是否为另一个字符串旋转之后的字符串
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <windows.h>
void left_rotate_once(char *str, int len)
{
char tmp = str[0];
int i = 0;
while (i<len - 1)
{
str[i] = str[i + 1];
i++;
}
str[i] = tmp;
}
void left_rotate(char *str, int len, int k)//方法一、循环k次左旋字符
{
assert(str);
assert(len > 0);
assert(k > 0);
k = k%len;
while (k--)
{
left_rotate_once(str, len);
}
}
void left_reverse(char *str, int len, int k)//方法二、双倍字符串法
{
k = k%len;
char *mem = (char *)malloc(sizeof(2 * len + 1));
strcpy(mem,str);
strcat(mem,str);
strncpy(str, mem + k,len);
free(mem);
}
void reverse(char* start, char* end)
{
while (start < end)
{
*start ^= *end;
*end ^= *start;
*start ^= *end;
start++;
end--;
}
}
void left_reverse(char *str, int len, int k)//方法三、大翻转法
{
assert(str);assert(len > 0);assert(k > 0);
k = k%len;
reverse(str, str + k - 1);
reverse(str + k, str + len - 1);
reverse(str, str + len - 1);
}
int find_left_reverse_string(char *str1, int len1, char *str2, int len2)
{
if (len1 != len2)
return -1;
char *mem = (char *)malloc(sizeof(2 * len1 + 1));
strcpy(mem, str1);
strcat(mem, str2);
if (strstr(mem, str2) != NULL)
return 1;
return -1;
}
int main(void)
{
char str[] = "abcd1234";
char str1[] = "qwertyuiop";
char str2[] = "wertyuiopq";
int len = strlen(str);
int k = 0;
int ret = 0;
// printf("please input the value of k:");
// scanf("%d",&k);
// left_rotate(str, len, k);
// for (int i = 0; i < len; i++)
// printf("%c",str[i]);
ret = find_left_reverse_string(str1,10,str2,10);
if (ret = 1)
printf("str2是str1的子串\n");
else if (ret = -1)
printf("str2不是str1的子串");
system("pause");
return 0;
}
注意:像这样的程序对于很多问题都是一样的,比如将数组前k个数据移动到最末尾也是同理。