Description:
Sakeven 正在对一段文字进行加密,规则如下:
把字符串中的每个单词进行逆序,比如 acm 变成 mca,其他字符顺序不变。
但是这个工作让他一个手写太麻烦啦,于是他想请你写个程序帮助他。
Input:
输入有包括多组数据。每组数据包括一行字符串。
eg:I Love You !
Output:
输出加密后的字符串。
eg:I evoL uoY !
我的思路就是根据空格将每个单词分开,然后每个单词reverse后输出。这个方法有很多漏洞,需要分类判断遇到的非字母字符是“ ”还是标点符号。学到了一个string的函数:s = str.substr(begin, count); 这样s中就存了str从begin开始的count长的字符串。字符串函数详解
参考了别人的代码,发现运用了队列的思想,十分简洁。遍历字符串的字符:如果是字母,加入辅助字符串的头部(头插法);不是字母(是空格或者标点符号),输出助字符串和此非字母字符,并清空辅助字符串。防止结尾是以字母结束的,最后输出一下辅助字符串。参考的别人的ac代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
while (getline(cin, str)) {
string s;//辅助字符串,每个样例一个
for (int i = 0; i < str.size(); ++i) {
if (isalpha(str[i])) {//是字母
s = str[i] + s;//加入辅助字符串
}
else {//不是字母(是空格或标点符号)
cout << s << str[i];//输出辅助字符串和此非字母字符
s.clear();//清空辅助字符串
}
}
cout << s << endl;//防止结尾是以字母结束的
}
}
我的至今不知道错在哪里的代码(有没有大佬帮我看一下错哪里了/(ㄒoㄒ)/~~):
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main() {
string str;
while (getline(cin, str)) {
int count = 0;
string s;
for (int i = 0, begin = 0; i < str.size(); ++i) {
if (str[i] != ' ' && isalpha(str[i])) {
count++;
}
if (str[i] == ' ' || i == str.size() - 1) {
s = str.substr(begin, count);
reverse(s.begin(), s.end());
cout << s;
begin = i + 1;
count = 0;
}
if (!isalpha(str[i])) {
cout << str[i];
continue;
}
}
cout << endl;
}
}