您的位置:首页 > 理论基础 > 数据结构算法

数据结构和算法经典100题-第10题

2015-05-04 19:26 246 查看
第10 题题目如下

翻转句子中单词的顺序。

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

句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。

例如输入“I am a student.”,则输出“student. a am I”。

题目分析:

这是一个字符串处理问题,由于是单词和句子的反转,可以考虑从输入流末尾遍历一直遍历输入流开头,在遍历到空格之后,将单词反转绑定到输出流上(如何将单词反转呢,可以使用两个游标,分别标识出单词的开始和单词的结束。)。这样是一个时间复杂度和空间复杂度都是O(n)的遍历。

好的,基本思路就是这样,不废话上代码:

//
//  10th.cpp
//  100-alg-tests
//
//  Created by bobkentt on 15-4-23.
//  Copyright (c) 2015ๅนด kedong. All rights reserved.
//

#include "10th.h"

#include <iostream>
#include <string>

using namespace std;

bool reverseStr(std::string& input, std::string& output) {
unsigned int inputStrLen = (unsigned int)input.size();

if (0 == inputStrLen) {
cout<<"Input string is NULL!"<<endl;
return false;
}

int end = inputStrLen-1;
int start = inputStrLen-1;
for (int i = inputStrLen - 1; i >= 0; i--) {

if (' ' == input[i] || i == 0) {
if (i != 0) {
start++;
}

for (int j = 0; j <= end - start; j++) {
output+=input[start+j];
}

if (i != 0) {
output+=' ';
}
end = i - 1;
start = end;
} else {
start--;
}

}

return true;
}


写个简单的测试程序,做一个单元测试:

int test_10()
{
string input("hello, I am a student!");
string output;
cout<<"test10"<<endl;

if (!reverseStr(input, output)) {
return -1;
}
cout<<"Output:"<<output<<endl;

return 0;
}


打印输出:

test10

Output:student! a am I hello,

Program ended with exit code:0

ok,这个题目解决了。

ps:最近因为一些家事,更新的慢了,接下来会恢复正常更新。每天至少更新一题这样。

路漫漫其修远兮,吾将上下而…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息