【1】题目
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student.a am I"
【2】思路
法,于是很快就可以跟面试官解释清楚解题思路:第一步翻转句子中所有的字符。比如翻转"I am a student."中所有的字符得到".tneduts a ma I",此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。第二步再翻转每个单词中字符的顺序,就得到了"student.a am I"。这正是符合题目要求的输出。
【3】代码
#include "pch.h"
#include <iostream>
#include<string>
using namespace std;
//翻转函数
void Reserve(char *pBegin,char *pEnd)
{
if (pBegin==nullptr || pEnd == nullptr)
{
return ;
}
//只需要小于,等于的位置为中心
while (pBegin< pEnd)
{
char temp = *pBegin;
*pBegin=*pEnd ;
*pEnd = temp;
pBegin++, pEnd--;
}
}
//翻转函数
void ReserveSentence(char *pData)
{
if (pData==nullptr)
{
//return nullptr;
}
//翻转句子
char *pBegin = pData;
char *pEnd = pData;
while (*pEnd!='\0'){pEnd++;}
pEnd--;
Reserve(pBegin, pEnd);
cout << *pData << endl;
//翻转句子中的单词
pBegin=pEnd= pData;
while (*pBegin!='\0')
{
if (*pBegin== ' ')
{
pBegin++;
pEnd++;
}
//注意此处的边界条件,为空格且不溢出
else if (*pEnd ==' '||*pEnd == '\0')
{
Reserve(pBegin, --pEnd);//旋转时需要将未指针向前移动一位,避免出现到'\0'位置
pBegin = ++pEnd;//旋转一个单词后,记得改变头指针的位置
}
else
{
pEnd++;
}
}
//return pData;
}
void main()
{
char pData1[] = "I am excellent student ";
ReserveSentence(pData1);
cout <<pData1 << endl;
}