您的位置:首页 > 编程语言 > C语言/C++

【C语言】字符串左旋k次的3种做法

2016-11-13 00:16 260 查看
左旋字符串k次的3种方法

1.循环移动法

2.交换法

3.双重字符法

1.循环移动法

**a[0]与最后一个元素交换,其他的每个元素均向前移动一位,循环n次就可以达到目的。

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<windows.h>

void strshift(char *str, int len, int step);

int main()
{
char str[] = "abcd1234";
char src[] = "1234abce";
int len = strlen(str);
printf("please enter: ");
int k = 0;
scanf_s("%d", &k);

printf("before: %s\n", str);

strshift(str, len, k);

printf("after: %s\n", str);

system("pause");
return 0;
}

void strshift(char *str, int len, int step)
{
assert(str);
assert(len > 0);
step %= len;
int i = 0;
for (; i < step; i++){
char tmp = str[0];
int j = 0;
for (; j < len - 1; j++){
str[j] = str[j
+ 1];
}
str[j] = tmp;
}
}




2.交换法

**核心部分

reverse(start, middle);

reverse(middle+1, end);

reverse(start, end);

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<windows.h>

void swap(char *x, char *y);
void reverse(char *start, char *end);
void strshift(char *str, int len, int step);

int main()
{
char str[] = "abcd1234";
char src[] = "1234abce";
int len = strlen(str);
printf("please enter: ");
int k = 0;
scanf_s("%d", &k);

printf("before: %s\n", str);

strshift(str, len, k);

printf("after: %s\n", str);

system("pause");
return 0;
}

void swap(char *x, char *y)
{
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
void reverse(char *start, char *end)
{
assert(start);
assert(end);

while (start < end){
swap(start, end);
start++, end--;
}
}

void strshift(char *str, int len, int step)
{
assert(str);
assert(len > 0);
step %= len;
char* start = str;
char* middle = str + step - 1;
char* end = str + len - 1;
reverse(start, middle);
reverse(middle+1, end);
reverse(start, end);
}




3.双重字符法

**重新分配内存 包含循环每一种情况

**指针直接指向

注意:使用动态分配内存的时候,一定要释放内存。:

free(buf);

buf = NULL;

void strshift(char* str, int len, int step)
{
assert(str);
assert(len>0);
step %= len;
char* buf = (char*)malloc(sizeof(char)*len*2+1);
strcpy(buf, str);
strcat(buf, str);
strncpy(str, buf+step, len);
free(buf);
buf = NULL;
}


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