1.实现一个函数,可以右旋字符串中的k个字符。
ABCDE右旋一个字符得到EABCD
ABCDE右旋两个字符得到DEABC
方法一:逆序法
ABCDE右旋两个字符 相当于以ABC ,DE分别逆序得到CBA,ED,然后在合在一起再进行一次逆序得到结果DEABC
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void exchange(char *str, int start, int end){ //交换字符串的前后位置,达到逆序的效果
int i, j;
char tmp;
for (i = start, j = end; i < j; ++i, --j){
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
void round(char *str, int time){ //time 为右旋次数
int len = strlen(str);
int pos = len - time % len;//以 pos 位置将一个字符串分开,%可以使右旋次数大于len
exchange(str, 0, pos - 1);
exchange(str, pos, len - 1);
exchange(str, 0, len - 1);
}
int main(){
char str[] = "ABCDE";
round(str, 2);
puts(str);
system("pause");
return 0;
}
方法二:拼接法
用strncat( str1,str2,n) , 在str1 后拼接 str2 中 n 个字符 再用 strncpy(str1,str2,n) 将 str2 中 n 个字符复制到 str1 中去。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void round_cat(char *str, int time){
int len = strlen(str);
int pos = len - time % len;
char tmp[256] = { 0 };
strcpy(tmp, str + pos); //复制
strncat(tmp, str, pos); //拼接 pos 个字符串
strcpy(str, tmp);
}
int main(){
char str[] = "ABCDE";
round_cat(str, 4);
puts(str);
system("pause");
return 0;
}
2.实现一个函数,可以左旋字符串中的k个字符。
ABCDE左旋两个字符得到CDEAB
相当于AB逆序BA ,CDE逆序为EDC ,再整体逆序CDEAB
方法一:逆序法
void round(char *str, int time){ //time 为左旋次数
int len = strlen(str);
int pos = time % len;//以 pos 位置将一个字符串分开,%可以使左旋次数大于len
exchange(str, 0, pos - 1);
exchange(str, pos, len - 1);
exchange(str, 0, len - 1);
}
左旋和右旋性质上是一样的只需要将逆序的位置进行调整。
方法二:拼接法
void round_cat(char *str, int time){
int len = strlen(str);
int pos = time % len;
char tmp[256] = { 0 };
strcpy(tmp, str + pos); //复制
strncat(tmp, str, pos); //拼接 pos 个字符串
strcpy(str, tmp);
}