HJ102. 字符统计
描述
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。数据范围:字符串长度满足
输入描述
一个只包含小写英文字母和数字的字符串。
输出描述
一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。
示例1
输入:
aaddccdc
输出:
cda
说明:
样例里,c和d出现3次,a出现2次,但c的ASCII码比d小,所以先输出c,再输出d,最后输出a.C++ 解法, 执行用时: 1ms, 内存消耗: 220KB, 提交时间: 2017-07-29
#include <stdio.h> #include <string.h> typedef struct { int num; int ch; }data; void swap(data *a, data *b) { data tmp; tmp = *a; *a = *b; *b = tmp; } int main() { char src[5000]; data ch[128]; int i = 0; int len = 0; int k = 0; while (scanf("%s", src) != EOF) { memset(ch, 0, 128 * sizeof(data)); for (i = 0; i<128; i++) { ch[i].ch = i; } len = strlen(src); for (i = 0; i<len; i++) { ch[src[i]].num++; } for (i = 0; i<128; i++) { for (k = 127; k>i; k--) { if (ch[k].num>ch[k - 1].num) swap(&ch[k], &ch[k - 1]); } } for (i = 0; i<128; i++) { if (ch[i].num == 0) { printf("\n"); break; } printf("%c", ch[i].ch); } } return 0; }
C 解法, 执行用时: 1ms, 内存消耗: 328KB, 提交时间: 2021-09-14
#include <stdio.h> #include <string.h> int main() { char str[1000] = {0}; while (~scanf("%s", str)) { int cnt[200] = {0}; int max = 0; for (int i = 0; i < strlen(str); i++) { cnt[str[i]]++; max = (max > cnt[str[i]]) ? max : cnt[str[i]]; } for (int i = max; i > 0; i--) { //j为char for (char j = '0'; j < 'z'+1; j++) { if (cnt[j] == i) { printf("%c", j); } } } printf("\n"); } return 0; }