读书人

微软等数据结构与算法口试100题第十题

发布时间: 2012-09-15 19:09:29 作者: rapoo

微软等数据结构与算法面试100题第十题

第十题


翻转句子中单词的顺序。

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。

句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。


分析:

可以根据空格符将单词分开,然后针对每个单词进行操作,string类型的有很多库函数,比如可以实现分割string类型的字符串。

这里使用c++实现,本来是想使用split函数进行分割的,但是MSDN上string对象成员函数http://msdn.microsoft.com/zh-cn/library/b873y76a%28v=vs.80%29

split函数示例运行不对,然后就采用查找空格来分割。希望有大牛指出split成员函数的问题。


代码如下:

#include<iostream>#include<string>using namespace std;using std::string;void reverseSequence(string & words){int lengthWords = words.length();if(0==lengthWords) return;char temp;//reverse all the wordsfor(int i =0; i < lengthWords/2; i++){temp = words.at(i);words.at(i) = words.at(lengthWords-1-i);words.at(lengthWords-1-i) = temp;}//conduct statisticsint wordsNum = 0;for(int i = 0; i < words.length(); i++){if(words.at(i)==' ')wordsNum++;}wordsNum = wordsNum + 1;int *arrayLength = new int[wordsNum];for(int i =0 ; i < wordsNum; i++)arrayLength[i] = 0;int j = 0;for(int i = 0; i < lengthWords; i++){if(' '!=words.at(i))arrayLength[j]++;else j = j + 1;}//reverse each wordsint index;int currentIndex = 0;for(int i =0 ; i < wordsNum; i++){index = currentIndex; while(index<arrayLength[i]/2 + currentIndex){temp = words.at(index);words.at(index) = words.at(currentIndex+currentIndex+arrayLength[i]-1-index);words.at(currentIndex+currentIndex+arrayLength[i]-1-index)=temp;index++;}currentIndex = currentIndex + arrayLength[i] + 1;}  }int main(){string a = "i am a student";for(int i=0;i<a.length();i++)cout<<a.at(i);cout<<endl;reverseSequence(a);for(int i=0; i<a.length();i++)cout<<a.at(i);cout<<endl;return 0;}


读书人网 >软件架构设计

热点推荐