下午做一道题准备准备期末考试。 Given a valid identifier in C programs, please write a program to reverse it by respectively reversing each part separated by ‘_’.
INPUT 3 nt_45 _me_ abc_123_456
OUTPUT tn_54 _em_ cba_321_654
看完后就开始敲了,思路就是扫一遍string,用hold去存贮还未逆序的单词。遇到'_'就开始逆序
,之后清空hold,直到结束。
信心满满的去敲了一会儿,结果发现有好多结果错误,最后发现是由于一开始没有想好start 和end到底要放在哪里,结果出现了不同的将hold赋值到s的情况,最后我将思路就定格在把start放在第一个有字符的地方,end提前i到达i的位置,遇到'_'就将end和start挪向下一个位置。
在hold往s传递是也有思维障碍,总是想不好结束位置,最后在大脑中构想两个数组,每一次的长度就是end-start
s从start开始向右
hold从end-start-1开始向左
一个个赋值。
代码如下:如有不足,欢迎更正
#include #include using namespace std; void rever(string &s); int main() { int N; string s; cin >> N; while (N--) { cin >> s; rever(s); cout << s << endl; } return 0; } void rever(string &s) { string hold; int size = s.size(), start = 0, end = start; for (int i = 0; i < size; i++) { if (s[i] != '_') { hold += s[i]; end++; if (i == size - 1) { for (int j = 0; j < end - start; j++) { s[start + j] = hold[end - start - j - 1]; } } } else if (hold.size() != 0) { for (int j = 0; j < end - start; j++) { s[start + j] = hold[end - start - j - 1]; } hold.clear(); start = end = i + 1; } else { start = end = i + 1; } }