目录
例题描述以前的思路不能解决该问题思路一代码实现
思路二代码实现
例题描述
对字符串中的所有单词进行倒排。
说明:
每个单词是以26个大写或小写英文字母构成;
非构成单词的字符均视为单词间隔符;
要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
每个单词最长20个字母;
输入描述: 输入一行以空格来分隔的句子。
输出描述: 输出句子的逆序。
示例1:
输入: I am a student输出: student a am I
以前的思路不能解决该问题
#include
<iostream
>
#include
<string
>
#include
<algorithm
>
using namespace std
;
int
main() {
string str
;
while (getline(cin
, str
)) {
std
::reverse(str
.begin(), str
.end());
for (int i
= 0; i
< (int
)str
.size(); ++i
) {
if (isspace(str
[i
])) continue;
int index
= i
++;
while (!isspace(str
[i
]) && i
< (int
)str
.size()) ++i
;
int j
= i
- 1;
while (index
< j
) {
char tmp
= str
[index
];
str
[index
] = str
[j
];
str
[j
] = tmp
;
index
++;
j
--;
}
}
cout
<< str
<< endl
;
}
return 0;
}
运行结果
答案错误
:您提交的程序没有通过所有的测试用例
case通过率为
90.00%
用例
:
$bo
*y gi
!r#l #
对应输出应该为
:
l r gi y bo
你的输出为
:
# gi
!r#l $bo
*y
因为本题存在分隔符的问题,所以需要换更换思路。
思路一
这个问题是包含了字符串常见操作的 切分 和 合并, 这个问题对单词分割符不设限制, 只要非字母, 都需要当成分割符, 并且分割符的数目不受限制。
整体思路为:
先切分(切分前先对分割符做处理, 统一分割符) , 此时可以使用 stringstream 进行切分。再合并(对切分结果逆序合并) 直接字符串拼接合并即可。
代码实现
#include
<iostream
>
#include
<sstream
>
#include
<string
>
#include
<vector
>
using namespace std
;
void Solution(vector
<string
>& res
, string
& str
, char delim
= ' ') {
stringstream ss
;
ss
<< str
;
string tmp
;
while (ss
>> tmp
) {
res
.push_back(tmp
);
}
}
int
main() {
string str
;
while (getline(cin
, str
)) {
vector
<string
> res
;
for (int i
= 0; i
< str
.size(); i
++){
if (!isalnum(str
[i
]))
str
[i
] = ' ';
}
Solution(res
, str
);
cout
<< res
[res
.size() - 1];
for (int i
= res
.size() - 2; i
>= 0; i
--)
cout
<< " " << res
[i
];
cout
<< endl
;
}
return 0;
}
思路二
从前往后扫描字符串,遇到是单词就放入vector,最后反向输出即可。
代码实现
#include
<iostream
>
#include
<vector
>
#include
<string
>
using namespace std
;
int
main(){
string str
;
while (getline(cin
, str
)){
vector
<string
>svec
;
svec
.clear();
string temp
= "";
for (int i
= 0; i
< str
.size(); ++i
){
if (str
[i
] >= 'a' && str
[i
] <= 'z' || str
[i
] >= 'A' && str
[i
] <= 'Z')
temp
+= str
[i
];
else{
if (temp
.size() > 0){
svec
.push_back(temp
);
temp
= "";
}
}
}
if (temp
.size() > 0)
svec
.push_back(temp
);
for (int i
= svec
.size() - 1; i
> 0; --i
)
cout
<< svec
[i
] << ' ';
cout
<< svec
[0] << endl
;
}
return 0;
}
链接:https://www.nowcoder.com/questionTerminal/81544a4989df4109b33c2d65037c5836