实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
方法一:
保存字符串的首位元素,将后一位元素赋给前一位,再将首位元素赋给最后一位,循环k次。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void left_handed(char* str,int k,int len){
k %= len;
int i = 0;
for ( i = 0; i < k; i++)
{
int j = 0;
char tmp = str[0]; //取每个字符串的第一位
for ( j = 0; j < len; j++)
{
str[j] = str[j + 1]; //将字符串中后一位的值赋给前一位
}
str[len - 1] = tmp; //将字符串第一位的值赋给最后一位
}
}
int main(){
char str[] = "ABCDE";
printf("旋转前:%s\n", str);
int k=0;
int len = strlen(str);
printf("输入逆转数:");
scanf("%d", &k);
left_handed(str, k, len);
printf("旋转后:%s\n", str);
system("pause");
return 0;
}
方法二:
进行三次字符串的逆转,先逆转前面的k位元素,再逆转后面的所有元素,最后再整体逆转。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//字符串整体逆转
void reverse(char* left, char* right){
while (left < right){
char tmp = *right;
*right = *left;
*left = tmp;
++left;
--right;
}
}
//字符串左旋
void Left_rotate(char* str, int k){
int len = strlen(str);
k %= len;
reverse(str, str + k - 1);//前k位
reverse(str + k, str + len - 1);//后面全部
reverse(str, str + len - 1);//整体逆转
}
int main(){
char str[] = "ABCDE";
printf("旋转前:%s\n", str);
int k=0;
int len = strlen(str);
printf("输入逆转数:");
scanf("%d", &k);
Left_rotate(str, k, len);
printf("旋转后:%s\n", str);
system("pause");
return 0;
}