您的位置:首页 > 其它

IT公司100题-10-翻转句子中单词的顺序

2014-08-08 14:03 495 查看
问题描述:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“Hello world!”,则输出“world! Hello”。

分析:

先翻转各个单词,然后整体翻转即可。

参考代码:

// 10.cc
#include <iostream>
#include <cstring>
#include <string>
using namespace std;

void reverse(char* p_start, char* p_end) {
char t;
while(p_start < p_end) {
t = *p_start;
*p_start = *p_end;
*p_end = t;

p_start++;
p_end--;
}
}

char* reverse_str(char* str) {
if (NULL == str)
return NULL;

char* p_start = str;
char* p_end = str;

// 翻转每个单词
while(*p_start != '\0') {
if(*p_start == ' ') {
p_start++;
p_end++;
} else if (*p_end == ' ' || *p_end == '\0') {
reverse(p_start, --p_end);
p_start = ++p_end;
} else {
p_end++;
}
}

p_end = --p_start;
p_start = str;
// 整体翻转
reverse(p_start, p_end);

return str;
}

int main() {
cout << "input a string:" << endl;
string s;
getline(cin, s);
char *p = new char[s.size() + 1];
strcpy(p, s.c_str());
reverse_str(p);
cout << p << endl;

delete []p;
return 0;
}


自己的代码:

char* reverse_str(const char* s1)
{
assert(s1);
stack<char> stack1;
const char* head = s1, *rear = s1;
while (*head != '\0')
{
while(*head != ' ' && *head != '\0')
head++;

const char* p;
for(p=head-1;p>=rear;p--)
stack1.push(*p);

if(*head == ' ')
stack1.push(' ');
if(*head != '\0')
rear = ++head;
}
char * return_v = new char[strlen(s1)+1];
int i=0;
while(!stack1.empty())
{
return_v[i++] = stack1.top();
stack1.pop();
}
return_v[i]='\0';
return return_v;
}


转载自源代码

本文链接地址: http://w.worthsee.com/index.php/10-%e7%bf%bb%e8%bd%ac%e5%8f%a5%e5%ad%90%e4%b8%ad%e5%8d%95%e8%af%8d%e7%9a%84%
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: