句子逆序——来自华为OJ平台测试基础篇



/*
 * 句子逆序       
 * 描述:  将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
 * 所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
 * 接口说明
 * 反转句子
 * @param sentence 原句子
 * @return 反转后的句子
 * public String reverse(String sentence);
 * 知识点:  数组 
 * 题目来源:  内部整理 
 * 练习阶段:  初级 
 * 运行时间限制: 10Sec
 * 内存限制: 128MByte
 * 输入: 
 * 将一个英文语句以单词为单位逆序排放。 
 * 输出: 
 * 得到逆序的句子
 * 样例输入: I am a boy                  
 * 样例输出: boy a am I
*/
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class CReverseSentence
{
public:
 std::string m_Sentence;
 std::string m_ReverseSentence;

public:
 CReverseSentence()
 {}
public:
 void Input(std::string &str);
 bool Isvalid(std::string str);
 std::string reverse(std::string sentence);
 void Output(std::string str);
};

void CReverseSentence::Input(std::string &str)
{
 getline(std::cin,str,'\n');

 return;
}

bool CReverseSentence::Isvalid(std::string str)
{
 int size = str.size();
 char c;

 /* 输入字符串为空 */
 if(size==0)
 {
  return false;
 }

 for(int i=0;i<size;i++)
 {
  c = str.at(i);

  if(!((c>=65 && c<=90) || (c>=97 && c<=122) || (c==32)))
  {
   return false;
  }
 }
 return true;
}

std::string CReverseSentence::reverse(std::string sentence)
{
 vector<std::string> Substr;
 vector<std::string>::reverse_iterator iter;
 int strlen = sentence.size();
 char Delm = 32;/* 空格 */
 int Pre = -1; /* 前一个空格的序号 */

 char c;

 for(int i=0;i<strlen;i++)
 {
  c = sentence.at(i);

  if(c==Delm)
  {
   /* 连续多个空格 */
   if(i==(Pre+1))
   {
    Pre = i;
    continue;
   }

   std::string str_temp = sentence.substr(Pre+1,i-Pre-1);
   Substr.push_back(str_temp);
   Pre = i;
  } 
 }

 c = sentence.at(strlen-1);

 if(c!=Delm)
 {
  std::string str_temp = sentence.substr(Pre+1,strlen-Pre);
  Substr.push_back(str_temp);
 }

 
 int size = Substr.size();

 /* 输入的字符串中没有英文字母 */
 if(size==0)
 {
  m_ReverseSentence = "";
  return m_ReverseSentence;
 }

 for(iter=Substr.rbegin();iter!=Substr.rend()-1;iter++)
 {
  std::string tempstr =  *iter;
  m_ReverseSentence += tempstr;
  m_ReverseSentence += " ";
 }
 if(iter!=Substr.rend())
 {
  std::string tempstr =  *iter;
  m_ReverseSentence += tempstr;
 }

 return m_ReverseSentence;
}

void CReverseSentence::Output(std::string str)
{
 std::cout<< str << endl;

 return;
}

int main()
{
 CReverseSentence p;

 p.Input(p.m_Sentence);
 bool flag = p.Isvalid(p.m_Sentence);

 if(!flag)
 {
  return -1;
 }

 p.reverse(p.m_Sentence);
 p.Output(p.m_ReverseSentence);

 system("pause");

 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值