C++实现反转字符串里的单词


0 问题描述

给定一个字符串,逐个翻转字符串中的每个单词。

示例:

输入: "the sky is blue",
输出: "blue is sky the".

1 方法一

解题思路:

  1. 对整个字符串进行反转,实现结果eulb si yks eht
  2. 遍历字符串,以空格' '为标识检索单词,对单词进行反转,实现结果blue is sky the

注:该方法不能实现对多余空格' '的删除,比如输入:"        the sky        “,输出:”        sky the        "。
示例代码:

//@brief 反转函数
//@str 字符串
//@begin 起始位置,end 终点位置
void CExmp::reverse(char *str, const int &begin, const int &end)
{
    if (NULL == str || begin == end)
        return;
    int len = (end - begin + 1) / 2;
    int i = begin, j = end;
    while (len-- > 0)
    {
        auto tem = str[i];
        str[i] = str[j];
        str[j] = tem;
        ++i;
        --j;
    }
}
//@brief 反转方法
void CExmp::reverse_str(char *str)
{
    if (NULL == str)
        return;
    int len = strlen(str);
    int begin = 0, end = len - 1;
    reverse(str, begin, end);
    end = begin;
    while (len-- > 0)
    {
        if (str[end] == ' ')
        {
            reverse(str, begin, end - 1);
            ++end;
            begin = end;
        }
        else
            ++end;
    }
    reverse(str, begin, end - 1);
}

2 方法二

解题思路:

  1. 遍历字符串,将字符串中单词存储在vector<string> words;容器中,剔除了所有的空格' '
  2. 调用reverse()方法对容器words中的单词进行反转;
  3. 清空字符串str,遍历words,将words中元素依次拼接到字符串str末尾,并添加空格' '

注:该方法不仅能实现字符串单词的反转,而且还能删除字符串中多余的空格。

void CExmp::reverse_thi_str(string &str)
{
    if (str.empty())
        return;
    vector<string> words;
    auto p1 = str.begin();
    auto p2 = str.begin();
    auto p3 = str.end();

    while (p2 != p3)
    {
        while (' ' == *p1 && p1 != p3)
            ++p1;
        p2 = p1;
        while (' ' != *p2 && p2 != p3)
            ++p2;
        if (p1 != p3)
            words.push_back(string(p1, p2));
        p1 = p2;
    }
    reverse(words.begin(), words.end());
    str.clear();
    for (auto i : words)
        str += i + " ";
    if (str.length() > 0)
        str.erase(str.length() - 1, 1);
}

3 方法三

解题思路:

  1. 构建输入字符串流对象istringstream is(str);,初始化为str
  2. 读取字符串流内容,自动以空格' '为标识,读取单个单词;
  3. 将读取的单词添加空格' '后,拼接在字符串str前面,实现单词反转。

注:该方法简洁实用,不仅能实现字符串单词的反转,而且还能删除字符串中多余的空格。关于字符串流对象,参阅C++ istringstream、ostringstream、stringstream类用法详解

void CExmp::reverse_sec_str(string &str)
{
    if (str.empty())
        return;
    istringstream is(str);
    string temp;
    is >> str;
    while (is >> temp)
        str = temp + " " + str;
    if (!str.empty() && str[0] == ' ')
        str = "";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i胡说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值