/*自己解法:确定空格位置,将其记录下来,对被空格分割开的每一小段实行部分翻转*/ //优点:思路清晰,即将人的思维转变为计算机语言。 //缺点:需要记录空格的位置->定义数组->空间复杂度变大 //上面的标准答案与我自己方法的优缺点互补 //(该代码只是我自己对该问题的思路,并非本题目的解答)!!!! #include<iostream> #include<string> #define N 10 using namespace std; int main() { int i, k = 0, a[N] = { 0 }; string s = "abc def gh"; string res;//定义一个新字符串接收变化后的s(res刚定义、未赋初值时默认为空) //在变大小写前先整体翻转,从而在变换大小写遍历的过程中确定翻转后空格的位置 //(如果先变换大小写再翻转,因为翻转后空格位置发生改变,为寻找翻转后空格位置需遍历第二次) reverse(s.begin(), s.end()); for (i = 0; i < 10; i++) { //是小写->变大写->接在res后 if (s[i] >= 'A' && s[i] <= 'Z') res += s[i] + 'a' - 'A'; //是大写,变小写->接在res后 else if (s[i] >= 'a' && s[i] <= 'z') res += s[i] - 'a' + 'A'; //是空格,直接接在res后 else { res += s[i], a[++k] = i;//记录空格位置(为方便下面在实现部分倒置的循环过程中确定起始与终止的位置,让a[0]=0) } } for (i = 0; i < k; i++) //以空格为分界,确定每一小部分的起始与终止点(不包含最后一小段,因为字符串结尾没有空格) reverse(res.begin() + a[i] + i, res.begin() + a[i + 1]); i--;//还原循环翻转结束前的i reverse(res.begin() + a[i + 1] + 1, res.end());//对最后一小段实现翻转 cout << res; return 0; }