1 条题解
-
0
思路与算法
读入字符流,找到第一个结束感叹号并截去它及后续内容。按UTF8字符边界把前面的内容分成字符数组,从后向前输出。程序兼容样例中的半角!和题述显示的全角感叹号;空格也是待逆序字符。
正确性说明
结束符之前的字符依输入顺序构成数组。逆向迭代逐一输出最后字符至第一字符,因而与题目要求的字符逆序相同,结束符不会被输出。按字符边界分割保证多字节字符内部顺序不被颠倒;ASCII输入的每个字符仍是一字节,样例abc得到cba。
复杂度
设输入总字节数B、结束符前字符数L。读流、查找、分割及输出总时间O(B+L),保存输入和各字符O(B+L),动态容器初始化O(1),扩容摊还计入总时间。原题未给长度上限,使用动态存储,不声称有固定最大长度。
易错点
不能用cin>>s丢失字符串内部空格。不要把!本身逆序输出。终止符后的输入不属于待逆序内容;若输入恰好为!,只需输出空行。代码换行是真实换行,不能写成字面\n作为题解排版。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { string s((istreambuf_iterator<char>(cin)), istreambuf_iterator<char>()); size_t end = min(s.find('!'), s.find("!")); if (end != string::npos) s.resize(end); vector<string> a; for (size_t i = 0; i < s.size();) { unsigned char ch = s[i]; size_t k = ch < 128 ? 1 : (ch < 224 ? 2 : (ch < 240 ? 3 : 4)); a.push_back(s.substr(i, k)); i += k; } for (auto it = a.rbegin(); it != a.rend(); ++it) cout << *it; cout << '\n'; }
- 1