左旋字符串或右旋字符串的相关练习题

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值