旋转单词,但无法按正确顺序返回结果



我正在编写一个函数,它接受一个字符串,并反转所有长度超过5个字符的以空格分隔的单词。

例如输入字符串的预期输出

"嘿,战友们">

应为

"嘿,wollef sroirraw">

当前使用我的代码,我正在获得结果

"sroirraw Hey wollef">

它旋转长度超过5个字符的单词,但它们没有按正确的顺序打印。

我认为之所以会发生这种情况,是因为要拆分的字符串的赋值是如何完成的,以及它们是如何打印的。我将y初始化为x,因为最初我没有使用向量来存储单词。我希望运行一个检查,如果单词超过5,它会将其反转,添加一个空格,继续字符串的循环,连接字符串并返回连接字符串。

std::string spinWords(const std::string &str)
{
std:: string x = "";
std:: string y = "";
std::vector<std::string> words;
for (int i = 0; i < str.length(); i++){
if (str[i] == ' '){
if (x.length() > 5){
std::reverse(x.begin(), x.end());
}
words.push_back(x);
x= "";
}
x = x + str[i];
}
if (x.length() > 5){
std::reverse(x.begin(), x.end());
}
y = x;
for (int j = 0; j < words.size(); j++){
y = y + words[j] + " ";
}
return y;
}
int main(){
std::cout << "nn" << spinWords("Welcome");
std::cout << "nn" << spinWords("Hey fellow warriors");
}

您的方法存在一些问题。

  1. 您可能不想将空格视为单词的一部分,所以当当前符号为' '时,不应该添加它:
if (str[i] == ' ')
{
//...
}
else // move it to else block
{
x = x + str[i];
}
  1. 按照您的逻辑,如果不为空,您忘记将最后一个单词添加到集合中:
// we add probably last word only if it is not empty
//empty ~ length() == 0 
if(!x.empty())
{
if (x.length() > 5)
{
std::reverse(x.begin(), x.end());
}
words.push_back(x);
}
//Why this assigment?  
//y = x;
for (int j = 0; j < words.size(); j++)
{
// use += for optimal string allocation
y += words[j] + " ";
}

一些改进:您可以使用std::stringstream按空格分隔字符串,返回etc:

#include <sstream>
std::istringstream iss(str);
for (std::string word; iss >> word; )
{
if (word.length() > 5)
{
std::reverse(word.begin(), word.end());
}
words.push_back(word);
}

您可能还想优化字符串y的内部重新分配。因此,您可以累积现有循环中所有单词的总大小,并为结果保留一些内存:y.reserve(totalLength);(实际用于大输入字符串(

最新更新