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

第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:最近因为一些家事,更新的慢了,接下来会恢复正常更新。每天至少更新一题这样。


路漫漫其修远兮,吾将上下而…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值