我需要反转字符串,但在单词之间只保留一个空格。
例子:
" na vrh brda vrbaa mrdaa!!! "
"!!!aadrm aabrv adrb hrv an"代码:
#include <iostream>
#include <string>
std::string ReverseOneSpace(std::string s) {
std::string str = s;
int j = 0;
for (int i = s.length() - 1; i >= 0; i--) {
// skip spaces
while (s[i] == ' ' && i >= 0)
i--;
while (s[i] != ' ' && i >= 0) {
str[j] = s[i];
j++;
i--;
}
// add only one space
if (s[i] == ' ') str[j] = ' ';
j++;
if (i == 0) break;
}
return str;
}
int main() {
std::string s = " na vrh brda vrbaa mrdaa!!! ";
std::string str = ReverseOneSpace(s);
std::cout << "\"" << str << "\"" << std::endl;
std::cout << "\"" << "!!!aadrm aabrv adrb hrv an" << "\"";
return 0;
}产出:
"!aabrv adrb hrv an aa! " // my output
"!!!aadrm aabrv adrb hrv an" // correct为什么在字符串反转后我会有一些额外的字符呢?
发布于 2022-05-01 13:41:14
另一种解决方案是使用C++库中可用的内容:
将这些结果结合在一起,将产生以下方案:
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
std::string ReverseOneSpace(std::string s)
{
std::istringstream strm(s);
std::string word;
std::string ret;
// Loop for each word found
while (strm >> word)
{
// Reverse the word
std::reverse(word.begin(), word.end());
// Add reversed word to front of the result string
ret = word + " " + ret;
}
// Remove the excess space at the back
ret.pop_back();
return ret;
}
int main() {
std::string s = " na vrh brda vrbaa mrdaa!!! ";
std::string str = ReverseOneSpace(s);
std::cout << "\"" << s << "\"" << std::endl;
std::cout << "\"" << str << "\"" << std::endl;
return 0;
}输出:
" na vrh brda vrbaa mrdaa!!! "
"!!!aadrm aabrv adrb hrv an"请注意,没有检查空格。手动检查空格很容易出错,至少在第一次尝试编写这样的代码时是如此。那么,如果有一些东西(在本例中是std::istringstream)为您检查空间,那么为什么要浪费时间呢?
发布于 2022-04-30 14:38:08
在这两个while循环中,您都超出了界限。变量i最终将是"-1“。
请将while循环中的状态从>=更改为>。
其他原因可能是一些设计问题。您不应该用其他语句更改循环主体中的循环变量(此处为i)。
#include <iostream>
#include <string>
std::string ReverseOneSpace(std::string s) {
std::string str = s;
int j = 0;
for (int i = s.length() - 1; i >= 0; i--) {
// skip spaces
while (s[i] == ' ' && i > 0) // ************
i--;
while (s[i] != ' ' && i > 0) { // ************
str[j] = s[i];
j++;
i--;
}
// add only one space
if (s[i] == ' ') str[j] = ' ';
j++;
if (i == 0) break;
}
return str;
}
int main() {
std::string s = " na vrh brda vrbaa mrdaa!!! ";
std::string str = ReverseOneSpace(s);
std::cout << "\"" << str << "\"" << std::endl;
std::cout << "\"" << "!!!aadrm aabrv adrb hrv an" << "\"";
return 0;
}发布于 2022-05-01 11:48:14
您也可以尝试我的代码,我使用的是reverse函数,所以不需要从后面循环字符串
#include<iostream>
#include<string>
using namespace std;
std::string ReverseOneSpace(std::string s) {
bool flagSpace = false;
bool flagWord = false;
reverse(s.begin(), s.end());
std::string result = "";
for(auto c : s) {
if (c == ' ') {
if (flagWord) flagSpace = true;
} else {
flagWord = true;
}
if (c != ' ') {
if (flagWord && flagSpace) {
result += ' ';
flagSpace = false;
flagWord = false;
}
result += c;
}
}
return result;
}
int main() {
std::string s = " na vrh brda vrbaa mrdaa!!! ";
std::string str = ReverseOneSpace(s);
std::cout << "\"" << str << "\"" << std::endl;
std::cout << "\"" << "!!!aadrm aabrv adrb hrv an" << "\"" << std::endl;
return 0;
}代码将像这样打印到终端
"!!!aadrm aabrv adrb hrv an"
"!!!aadrm aabrv adrb hrv an"https://stackoverflow.com/questions/72069293
复制相似问题