实现一个函数,可以左旋字符串中的k个字符。---C语言

实现一个函数,可以左旋字符串中的k个字符。
例如:ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB.
实现字符串的左旋即将字符串的字谜放在字符串的后面,然后在将字符串向前挪。
其实要实现该功能,实现方法很多,我这里写两种。
方法一:将要左旋的字母个数n通过键盘输入得到。根据个数取字符串前n个字母,将其放在一个数组里,然后将字符串后面的字符向前挪,之后将数组里面的内容放在字符串的后面即可完成。
下面看一下这个方法的代码:
内容其实很简单,关键要将变量分清,并且要用指针对字符串的内容进行操作。

#include<stdio.h>
#include<Windows.h>
#pragma warning(disable:4996)
void Rotate(char *p, int num,int s){
	int i = 0;
	char set[10] = { ' ' };
	for (; i < num; i++){
		set[i] = *(p + i);
	}
	for (i = 0; i < s-num; i++){//剩下的元素
		*(p + i) = *(p + num+ i);//一定是加上要被左旋字母的个数
	}
	int j = 0;
	for (i = s-num ; i < s; i++){//多个变量时,分清变量
		*(p + i) = set[j];
		j++;
	}
}
int main(){
	char str[] = { 'A', 'B', 'C', 'D', 'E' };
	int sum = sizeof(str) / (sizeof(str[0]));
	int n = 0;
	for (int i = 0; i < sum; i++){
		printf("%c ", str[i]);
	}printf("\n");
	printf("你想要左旋多少个字符?\n");
	scanf("%d", &n);
	Rotate(str, n,sum);
	for (int i = 0; i < sum; i++){
		printf("%c ", str[i]);
	}
	system("pause");
	return 0;
}

方法二:我们通过不断的变换,可以发现左旋一个字母时,可以将第一个字母拿出来,然后将后面的字母向前挪,然后把字母放在最后一个位置。当要左旋两个字母时,在上面的基础上再操作一次,即可实现。这样就的带规律只用写一个循环,然后次数在写一个循环,即可。
以下即使实现:

#include<stdio.h>
#include<Windows.h>
#pragma warning(disable:4996)
void rotate(char *p,int s,int n){
	int i = 0,j=0;
	for (; j < n; j++){
		char a = *(p + 0);
	for( i=1; i < s; i++){
		*(p + i - 1) = *(p + i);
	}*(p + i - 1) = a;
	}
}
int main(){
	char arr[] = { 'A', 'A', 'B', 'C', 'D' };
	int num = 0;
	int size = sizeof(arr) / sizeof(arr[0]);
	scanf("%d", &num);
	rotate(arr,size,num);
	for (int i = 0; i < size; i++){
		printf("%c ", arr[i]);
	}
	system("pause");
	return 0;
}

这里还有另外两种做法:
方法三:使用双字符串实现,即将该字符串赋值为双串,然后通过选择要左旋的字母的个数,将该双串从相应位置向后截取原字符串长度。下面画个图举例:
在这里插入图片描述
这样就可以完成任意数字的左旋。下面展示一下核心代码:

char * rotate(char *s,char *s1,int n,int l){
	int i = 0;
	while (i<l){
		*(s1+i)= *(s + n+i);
		i++;
	}*(s1 + i) = '\0';
	return s1;
}
int main(){
	char str[N] = "ABCDEF";
	char str1[N];
	int len = strlen(str);
	int n = 0;
	printf("请输入要左旋的个数:\n");
	scanf("%d", &n);
	strcat(str, "ABCDEF");
	printf("%s\n",rotate(str,str1, n%len, len));
	system("pause");
	return 0;
}

方法四:可以通过对指定下标的字母进行逆序,就可实现。(可需要多次的观察实践)。
下面还是用途解释一下:
在这里插入图片描述
如上图,可以经过三次逆置,即可实想要的左旋字符串。
下面是核心代码:

void reverse(char *a,int s,int e){
	while (s < e){
		*(a + s) ^=*(a + e);
		*(a + e) ^= *(a + s);
		*(a + s) ^= *(a + e);
		s++; e--;
	}
}
int main(){
	int n = 0;
	char str[] = "ABCDEF";
	int len = strlen(str);
	printf("你想要左旋多少个字母:\n");
	scanf("%d", &n);
	reverse(str,0, n%len - 1);
	reverse(str,n%len, len - 1);
	reverse(str,0, len - 1);
	printf("%s\n", str);
	system("pause");
	return 0;
}

里面^=是按位异或的操作,具体,可以参考我以前的博客。
如果大家还有更简单的方法,欢迎指点哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值