作者:小琛
欢迎转载,请标明出处
1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
思路一:一次一次翻转,共进行k次,每次记录该次的翻转值,将所有位向前进一位,最后将记录的该值给最后一位**(时间复杂度高)**
#include <stdio.h>
void rotating(char *p, int len, int k)
{
k = k%len; //化简为最小的翻转次数
char tmp;
int i = 0;
while (k--) //一共进行k次
{
tmp = p[0]; //记录此次翻转的值
for (i = 0; i < len - 1; i++) //'/0'不进行翻转
{
p[i] = p[i + 1];
}
p[len-2] = tmp; //'/0'不进行翻转
}
}
思路二:先将该字符串的前k个逆置,再将后len-k个逆置,最后将整个字符串逆置
(时间复杂度低,推荐方法)
void rotate_help(int *left,int *right)
{
while (left<right)
{
*left^=*right;
*right^=*left;
*left^=*right;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k){
if (nums==NULL||numsSize==1)
{
return;
}
k=k%numsSize;//排除不必要的旋转
rotate_help(nums,nums+numsSize-k-1);//先将前numSize-k个逆置
rotate_help(nums+numsSize-k,nums+numsSize-1);//再将后k个逆置
rotate_help(nums,nums+numsSize-1);//整体逆置即可达到要求
}
2.判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1
给定s1 = abcd和s2 = ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
思路1:写一个函数,将所有得旋转函数情况都比较一遍,符合返回1,不符合返回0
int judge_fun1(char* src, char* dest)
{
int len = strlen(src);
char str;
for (int i = 0; i < len-1; i++)
{
str = *src;
for (int j = 0; j < len - 1; j++)
{
*src = *(src + 1);
src++;
}
*src = str;
src = src - len + 1;
if (!(strcmp(dest, src)))
{
return 1;
}
}
return 0;
}
int main()
{
char p[] = "aeabc";
char q[] = "abcde";
int count = 0;
count = judge_fun1(q, p);
printf("%d", count);
return 0;
}
思路2:空间换时间,动态开辟一块内存,将源字符串拷贝一份,再在其后面追加一份,如果是旋转而来,这个新字符串里必包含。
int judge_fun(const char* src, const char* dest)
{
char* p = (char*)malloc(strlen(src) + strlen(src) + 1);
strcpy(p, src);
strcat(p, src);
if (strstr(p, dest) == NULL)
{
return 0;
}
else
return 1;
}
int main()
{
char p[] = "cdeab";
char q[] = "abcde";
int count = 0;
count = judge_fun(q, p);
printf("%d", count);
return 0;
}