/*自己解法:确定空格位置,将其记录下来,对被空格分割开的每一小段实行部分翻转*/
//优点:思路清晰,即将人的思维转变为计算机语言。
//缺点:需要记录空格的位置->定义数组->空间复杂度变大
//上面的标准答案与我自己方法的优缺点互补
//(该代码只是我自己对该问题的思路,并非本题目的解答)!!!!

#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;
}