面试题42反转单词顺序VS左旋字符串(循环左移字符串)

 

 反转单词顺序可以用栈来顺序存储单词,或用istringstream 字符串流来做或用最原始的反转来做

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
using namespace std;
//  翻转单词
//反转字符串
void Reverse(char *pBegin,char *pEnd)
{
     if(pBegin==NULL||pEnd==NULL)
	 {
	     return ;
	 }
	 while(pBegin<pEnd)
	 {
	    char temp=*pBegin;
		*pBegin=*pEnd;
		*pEnd=temp;
		pBegin++;pEnd--;
	 }
}
char* ReverseSentence(char *str)
{
     if(str==NULL)
	 {
	     return NULL ;
	 }
	 int length=strlen(str);
	 char *pBegin=str;
	 char *pEnd=str+length-1;
	 Reverse(pBegin,pEnd);
	 pBegin=pEnd=str;
	 while(*pBegin!='\0')//pBegin遍历完字符串
	 {
	     if(*pBegin==' ')
		 {
		      pBegin++;
			  pEnd++;
		 }
		 else if(*pEnd==' '||*pEnd=='\0')
		 {
		      Reverse(pBegin,--pEnd);//此处pEnd=' ' 要往前移动一个
			  pBegin=++pEnd;//pBegin pEnd 要再次移到空格
		 }
		 else
		 {
		     pEnd++;
		 }
	 }
	 return str;
}
///左旋字符串等价于循环左移字符串  对于abcdefg  左旋2位或叫循环左移两位  结果为 cdefgab
//三次反转即可得到左旋字符串
char* LeftRotateString(char *str,int n)//左旋n位
{
     if(str==NULL||n<0)
	 {
	     return NULL;
	 }
	 int length=strlen(str);
	 char *pFirstBegin=str;
	 char *pFirstEnd=str+n-1;
	 char *pSecondBegin=str+n;
	 char *pSecondEnd=str+length-1;
	 Reverse(pFirstBegin,pFirstEnd);//翻转字符串前n个字符
	 Reverse(pSecondBegin,pSecondEnd);//翻转字符串后面字符
	 Reverse(pFirstBegin,pSecondEnd);//翻转整个字符串
	 return str;
}
//以下为最暴力的左旋方法   这也是一般人能想到的最简单的办法就是时间复杂度比较高
void LeftMove1Bit(char *str)//字符串左移一位函数
{
      if(str==NULL)
	  {
	       return;
	  }
	  int length=strlen(str);
	  char temp=str[0];
	  for(int i=0;i<length-1;i++)
	  {
	       str[i]=str[i+1];
	  }
	  str[length-1]=temp;
}
char* LeftRotateString2(char *str,int n)//左旋n位
{
     if(str==NULL||n<0)
	 {
	     return NULL;
	 }
	 for(int i=0;i<n;i++)//循环左移n位
	 {
	     LeftMove1Bit(str);
	 }
	 return str;
}
int main()
{
	cout<<"please input a sentence"<<endl;
	char ch[100];
	gets(ch);
	ReverseSentence(ch);
	cout<<ch<<endl;

	char test[]="abcdefg";
	char test2[]="abcdefg";
	char *p;
	p=LeftRotateString(test,3);
	cout<<p<<endl;
	p=LeftRotateString2(test2,3);
	cout<<p<<endl;
	
   return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值