描述
实现一个函数,可以左旋字符串中的k个字符。
例如:ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
方法一:设a=k%strlen(str),str为字符串变量,k为旋转次数,将str首元素开始a个元素后的每个元素向前移动一再将已存起的首元素放置str尾部,如此进行a次。
#include <stdio.h> #include<string.h> #include <assert.h> //左旋 void LeftRotate(char* str, int len, int num) { assert(str); assert(len); assert(num); num%=len; while (num) { char temp = str[0]; int i = 0; for (; i < len-1; i++) { str[i] = str[i + 1]; } str[i] = temp; num--; } } int main() { char str[] = "abcd1234"; int len = strlen(str); int num = 0; printf("请输入左旋的次数:"); scanf("%d", &num); printf("before: %s\n", str); LeftRotate(str, len, num); printf("after : %s\n", str); return 0; }
方法二:设a=k%strlen(str),str为字符串变量,k为旋转次数,将str首元素开始a个元素为一组(左组),剩余元素为一组(右组),将左组进行逆序排列,再将组进行逆序排列,最后再整体逆序排列。
#include<stdio.h> #include<string.h> void LeftRotate(char*a,int num) { int len = strlen(a); //左逆序 reverse(a,a+num-1); //右逆序 reverse(a+num,a+len-1); //整体逆序 reverse(a, a + len - 1); } int main() { char a[] = "abcdef"; int num=0; scanf("%d", &num); int len = strlen(a); num %= len; LeftRotate(a,num); printf("%s", a); return 0; }
void reverse(char* left,char*right) { while (left < right) { char temp = *left; *left = *right; *right = temp; right--; left++; } }