/*
题目描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。
为简单起见,标点符号和普通字母一样处理。如:”I am a student.”翻转成”student. a am I”。
——剑指offer
*/
法一:读入每一个字符串单词,将单词入栈接着将空格也入栈,运用栈先进先出的原则实现题目要求。
法二:首先将整个句子按字符翻转得到“.tneduts a ma I”,然后再将其中每个单词的字符旋转”student. a am I”。
#include<iostream>
#include <stdio.h>
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* reversentense(char *pdata)
{
if(pdata == NULL)
return NULL;
char *pbegin = pdata;
char *pend = pdata;
while(*pend!='\0')
pend++;
pend--;
reverse(pbegin,pend);
pbegin = pend = pdata;
while(*pbegin!='\0')
{
if(*pbegin==' ')
{
pbegin++;
pend++;
}
else if(*pend==' '||*pend=='\0')
{
reverse(pbegin,--pend);
pbegin = ++pend;
}
else
pend++;
}
cout<<pdata<<endl;
return pdata;
}
int main()
{
char str[]="i am a student";
char *reversestr = reversentense(str);
cout<<reversestr;
}
同样的方法可以用于字符串的左旋转操作。字符串的左旋转操作是吧字符串前面的若干个字符转移到字符串的尾部。比如输入字符串“abcdefg”和数字2,该函数将返回左旋转2位得到的结果“cdefgab”。具体方法是:先分别旋转两组字符串,结果为”cbagfed”,然后再整体旋转,得“defgabc”
代码如下:
char *LeftRotateString(char* pstr,int n)
{
if(pstr!=NULL)
{
int nlength = static_cast<int>(strle(pstr));
if(nlengh>0&&n>0&&n<nlength)
{
char* pfirststart =pstr;
char* pfirstend =pstr+n-1;
char* psecondstart = pstr+n;
char* psecondend = pstr+nlength-1;
reverse(pfirststart,pfirstend);
reverse(psecondstart ,psecondend);
reverse(pfirststart ,psecondend);
}
return pstr;
}
}
法二:先把第n个字符之后的内容赋给一个新的字符串变量,然后再复制前面的字符串。本方法更容易理解。
char* LeftRotateString(char* pstring,int n)
{
int len =strlen(pstring);
char *str3 = new char[len];
char* str4 =str3;
if(pstring!=NULL)
{
if(len>0&&n>0&&len>n)
{
for(int i=0;i<len-n;i++)
*str3++ = *(n+pstring++);
for(int i=0;i<n;i++)
*str3++ = *pstring++;
*str3 ='\0';
return str4;
}
}
return pstring;
}