列表

详情


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

上一题