第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:最近因为一些家事,更新的慢了,接下来会恢复正常更新。每天至少更新一题这样。
路漫漫其修远兮,吾将上下而…