11. 按单词下标区间翻转文章内容

116 阅读1分钟

题目描述

给定一段英文文章片段,由若干单词组成,单词间以空格间隔,单词下标从0开始。
请翻转片段中指定区间的单词顺序并返回翻转后的内容。

例如给定的英文文章片段为"I am a developer",翻转区间为[0,3],则输出“developer a am I”。

String reverseWords(String s, int start, int end)

输入描述

使用换行隔开三个参数

  • 第一个参数为英文文章内容即英文字符串
  • 第二个参数为待翻转内容起始单词下标
  • 第三个参数为待翻转内容最后一个单词下标

输出描述

翻转后的英文文章片段所有单词之间以一个半角空格分隔进行输出。

备注

英文文章内容首尾无空格

用例

输入I am a developer. 1 2
输出I a am developer.
说明
输入hello world -1 1
输出world hello
说明下标小于0时,从第一个单词开始
输入I am a developer 0 5
输出developer a am I
说明下标大于实际单词个数,则按最大下标算
输入I am a developer -2 -1
输出I am a developer
说明翻转区间无效时,不做翻转

C++源码

#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;

vector<string> split(string& s, char delimeter) {
    vector<string> res;
    string item;
    stringstream ss(s);
    while(getline(ss, item, delimeter)) {
        res.push_back(item);
    }
    return res;
}

int main()
{
    string str;
    getline(cin, str);
    vector<string> vec = split(str, ' ');
    int start;
    cin >>start;
    if (start < 0) {
        start = 0;
    }
    if (start > vec.size()) {
        start = vec.size() -1;
    }
    int end;
    cin >> end;
    if (end < 0) {
        end = 0;
    }
    if (end > vec.size()) {
        end = vec.size() -1;
    }
    if (start >= end) {
        cout << str;
        return 0;
    }
    int l = start;
    int r = end;
    while (l < r) {
        string tmp = vec[l];
        vec[l] = vec[r];
        vec[r] = tmp;
        l++;
        r--;
    }
    for (int i = 0; i < vec.size(); i++) {
        cout << vec[i];
        if (i < vec.size() -1) {
            cout << " ";
        }
    }
    return 0;
}