我正在编写一个函数,它接受一个字符串,并反转所有长度超过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");
}
您的方法存在一些问题。
- 您可能不想将空格视为单词的一部分,所以当当前符号为
' '
时,不应该添加它:
if (str[i] == ' ')
{
//...
}
else // move it to else block
{
x = x + str[i];
}
- 按照您的逻辑,如果不为空,您忘记将最后一个单词添加到集合中:
// 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);
(实际用于大输入字符串(