解题思路:这个字符串要达到去除大小写的重复,同时达到排序的效果,因为本身字母的排序就类似于数字的去重排序,可以通过一个哈希表,来存储每个字母的存储情况,如果哈希表对应存储的1,代表存储的该字母是大写形式,如果存储的2,则该字母是小写形式,如果是0则表示该字母未出现
1:定义一个大小为26的哈希数组,因为有26个字母,定义一个字符指针cur指向字符数组str,通过cur的移动达到遍历字符数组的效果
2:访问的while条件是cur指针未遇到字符数组结束符\0,开始遍历,如果当前字母的ascii>a的码值即是小写,并且harshTable里下标为当前小写字母-'a'的值对应为0,即从未出现过,则首先赋值为1,因为如果出现了大写字母,必须输出大写字母(harshTable[chrElem-'a']就是为了避免最开始有大写字母,赋值为2后,出现了小写字母又赋值为1,因为题目要求去出重复的小写字母,故只能1转换为2,不能2转换为1),将小写字母作为去重处理,故如果后面出现了大写字符,harshTable里对应元素必须更新为2,(else if里的判断,如果出现了大写字母,则对应下标为 当前字母-'A'或 当前字母+32-'a' 的值需要更新值为2),然后cur指针++,指向下一个字符数组里的下一个字符
**这个哈希表的操作就可以达到去重,再从哈希表头开始遍历输出值不是0的元素,就可以同时达到排序和去重的效果
3:从头开始遍历哈希表:如果harshTable的值是1,则代表只出现了小写的字母,先printf("%c",'a'+i),输出该小写字母,如果harshTable的值是2,则代表出现了大写字母就一定要输出大写的,printf("%c",'A'+i)来输出大写的字母,从头开始遍历就是从A-Z进行了出现过字符的排序
**用到了'a或者A'+i 来表示输出字符的形式,再东大考研中很常见需要谨记