您的位置:首页 > 其它

字符的左旋

2017-11-06 22:14 197 查看
1. 实现一个函数,可以左旋字符串中的k个字符。

ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

方法1:常规做法,将每个左移

#include "stdio.h"

void left_move(char *arr,
int len,
int count)

{

count %=
len;//有效的左旋次数

int i = 0;

while (count--)//左旋的次数

{

char tmp =
arr[0];//将第一个取出

for (i = 0; i <
len-1; i++)//左旋一次

{

arr[i] =
arr[i + 1];

        }

arr[i] = tmp;//将取出的第一个放至最后

     }

}

int main()

{

char arr[] =
"abcd";

int sz =
sizeof(arr)/sizeof(arr[0]);//大小为5

int count = 0;

printf("左旋之前:%s\n", arr);

printf("请输入左旋的字符个数:\n");

scanf_s("%d", &count);

    left_move(arr, sz-1,count);

printf("左旋之后:%s\n", arr);

system("pause");

return 0;

}

 方法2:部分逆序后再整体逆序

void reverse(char *start ,char*end)

{

while (start <
end)

{

*start ^= *end;

*end ^= *start;

*start ^= *end;

start++;

end--;

}

}

void left_move(char *arr,
int len,
int count)

{

count %=
len;//有效的左旋次数,假设左旋两次

reverse(arr,
arr + count-1);//逆置前半部分 ab -》 ba

reverse(arr +
count, arr +
len - 1);//逆置后半部分  cd-》dc

reverse(arr,
arr + len - 1);//整体逆置  ->cdab

}

2.判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

 #include "stdio.h"

#include "assert.h"

#include "string.h"

int is_not(char *p,
char*q)

{

assert(p !=
NULL&&q !=
NULL);//传入指针不能为空

strcat(p,
p, strlen(p));//连接两个字符串的函数

if (strstr(p,
q) ==
NULL)//子字符串比较的函数

{

return -1;

}

else{

return 1;

}

}

int main()

{

int ret = 0;

char arr1[] =
"abcd";

char arr2[] =
"dabc";

    ret = is_not(arr1, arr2);

if (ret == 1)

{

printf("是");

}

if (ret == -1)

{

printf("不是");

}

system("pause");

return 0;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: