C++字符串旋转3种方法实现

本文详细介绍了使用C++语言通过循环递归法和指针反转法实现字符串的左旋转操作,包括代码实现和核心逻辑解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



//左旋转字符串abcdefgh->cdefghab

//循环递归法
#include <iostream>
#include <string.h>
using namespace std;
void runstring(char *str,int n)
{
	int i = 0;
	int j = i+n;
	int len = strlen(str);
	char *p = str;
	char ch;
	while(j<len)
	{
		for(int m=0;m<n;m++)
		{
			if(p[j]=='\0')break;
			ch = p[i];
			p[i]=p[j];
			p[j]=ch;
			i++;j++;
		}
	}
	//此时defgh cab后面的cab需要在进行旋转.
	for(int k=0;k<n-len%n;k++)
	{
		//最后面需要旋转的字符串是len%n,因为不满足n位,于是我先交换len%n位,
		//这样就只查n-len%n位就可以转换号了,于是我将剩余的部分进行右旋转.
		ch=p[i];
		int m;
		for(m=i;m<len-1;m++)
		{
			p[m]=p[m+1];
		}
		p[m]=ch;
	}
	
} 
int main()
{
	char str[]="abcdefghmk";
	runstring(str,3);//总共10位,而我们需要3位的转动,则呢么做呢?
	cout<<str<<endl;
	return 0;
}




//<指针反转法>
#include <iostream> //一旦出现移动位数不够的情况就跳出循环,开始移动.
#include <string.h>i
using namespace std;
void runstring(char *str,int n)
{
	if(n<=0 || str==NULL)return;
	//char *fptr = str;
	//char *lptr = str+n;
	char *p  = str;
	int len = strlen(str);
	int i = 0;
	int j = i+n;//
	int k;
	char ch;
	while(len-j>=n)
	{
		for(k=0;k<n;k++)
		{
		ch = p[j];
		p[j] = p[i];
		p[i] = ch;
		i++;
		j++;
		}
	}
	n = len-j;
	for(k=0;k<n;k++)
	{
		ch = p[len-1];
		int sum = len-1;
		for(int m = 0;m<=j-i;m++)
		{
		 	p[sum] = p[sum-1];
			sum--;
		}
		p[sum]=ch;
	}
}
int main()
{
	char str[]="abcdefghlm";
	runstring(str,4);
	cout<<str<<endl;
	return 0;
}
*/







//<暴力移位法>
#include <iostream>
#include <string.h>
using namespace std;
void runstring(char *str,int n)
{
	if(str==NULL || n==0)return;
	if(n>0)
	{
		for(int i=0;i<n;i++)
		{
			char *p  = str;
			char ch=p[0];
			while(*p!='\0')
			{
			*p=*(p+1);
			p++;
			}
			*(p-1) = ch;
		}
	}
else
	{
		int m = strlen(str);
		for(int i=0;i<-n;i++)
		{
			char *p = str+m-1;
			char ch = *p;
			int save = m-1;	
			while(m-1>0)
			{	
				*p = *(p-1);
				p--;
				m--;
			}
			*p=ch;
		  m=save; 
		}
	}
}
int main()
{
	char str[]="abcdefgh";
	runstring(str,0);
	cout<<str<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值