C++ 选择排序小联系
#include <iostream> /* 输入一行字符串仅由小写字母所构成。 输出为一行,按 aa, bb, cc, …, zz 在字符串中的出现次数按从多到少, 将 aa, bb, cc, …, zz 排序,不同字母间以一个空格隔开,忽略行末空格。 阐述: 1.计算出现次数时是可重叠的,即在字符串 "aaaa" 中,aa 出现了三次 2.若出现次数相同,则按照字典序升序排列,比如若是ee,dd 都出现 1 次,则 dd 放在 ee 前面 3.若aa, bb, cc, …, zz 都没有出现过,则什么都不用输出 例:输入bbaaqccc,则输出cc aa bb (选择合适的排序方式,完成这个题目) */ void test(char* buf) { int a[26] = { 0 }; //定义一个数组存放叠字母的数量 for (int i = 0; i < strlen(buf) - 1; i++) { if (buf[i] == buf[i + 1]) { a[buf[i] - 'a']++; //将叠字母a-z按照0-25的方式存入数组中,并按照出现的次数自加1 } } for (int i = 0; i < 26; i++) { int max = 0, max_id; //定义出现的次数的大小,初始为0,次数对应的下标 for (int j = 0; j < 26; j++) { if (a[j] > max) // a[26]中存放叠字母出现的频次,如果当前出现的次数大于初始值,进入循环 { max = a[j]; //如果当前出现的次数大于初始值,则将最大值赋值给max,并将该次循环的下标赋值给max_id { max = a[j]; max_id = j; } } } if (max == 0) return; //如果第一轮下来发现不存在叠字母,则自动退出 if (i != 0) printf(" "); printf("%c%c", max_id + 'a', max_id + 'a'); //打印对应的叠字母,对应的max_id的值+'a'为叠字母, a[max_id] = 0; //将数组中存放的值置空,防止循环利用,在用剩下的值进行对比 } } int main() { char buf[] = "aabbqccc"; test(buf); return 0; }