输入一个字符串,以‘?’结束,统计各字母出现的次数,并按照字母出现的多少降序输出

法一:找到M,递减输出

找到最多次数M,依次递减输出相应字符和次数

#include<stdio.h>
int main()
{
	char s[50];
	int i = 0, j, A[26] = { 0 }, a[26] = { 0 };
	从缓冲区输入字符串
	while ((s[i++] = getchar()) != '?');
	s[i - 1] = '\0';
	int n = i;
    统计大小写字母出现次数
	for (i = 0; i < n; i++)
	{
		if (s[i] >= 'A' && s[i] <= 'Z')
			A[s[i] - 'A']++;
	}
	for (i = 0; i < n; i++)
	{
		if (s[i] >= 'a' && s[i] <= 'z')
			a[s[i] - 'a']++;
	}
	假定大写字母出现最多次数为M
    int M = 0;
	for (i = 0; i < 26; i++)
	{
		if (A[i] > M)
			M = A[i];
	}
	//从M递减输出相应次数对应的字母
	for (j = M; j > 0; j--)
	{
		for (i = 0; i < 26; i++)
		{
			if (A[i] == j)
				printf("%c %d\n", 'A' + i, A[i]);
		}
	}
	同上
	for (i = 0; i < 26; i++)
	{
		if (a[i] > M)
			M = a[i];
	}
	for (j = M; j > 0; j--)
	{
		for (i = 0; i < 26; i++)
		{
			if (a[i] == j)
				printf("%c %d\n", 'a' + i, a[i]);
		}
	}
	
	return 0;
}

法二:假定M,遍历找M输出

假定最大次数M,找到真的M,输出相关

#include<stdio.h>
int main() 
{
	char a[100];
	int C[26] = { 0 }, c[26] = { 0 }, n = 0, i, j, M;
	输入字符串
	while ((a[n++] = getchar()) != '?');
	a[n - 1] = '\0';
	统计次数
	for (i = 0; i < n; i++)
	{        
		if (a[i] >= 'A' && a[i] <= 'Z') 
 			C[a[i] - 'A']++; 
		if (a[i] >= 'a' && a[i] <= 'z')
			c[a[i] - 'a']++;
    }
    
	for (i = 0; i < 26; i++)  //共26个字母,循环26次
	{         
		M = i;第i次假定i为最大数对应下标
		for (j = 0; j < 26; j++)  //遍历数组把最大数下标赋给M
		{     
			if (C[j] > C[M])   
				M = j;
        }
		if (C[M])                //若M对应数字非0,输出相关
		{
			printf("%c %d\n", 'A' + M, C[M]);
			C[M] = 0;
        }
    }
    同上
	for (i = 0; i < 26; i++)
	{
		M = i;
		for (j = 0; j < 26; j++)
		{
			if (c[j] > c[M])
				M = j;
		}
		if (c[M])
		{
			printf("%c %d\n", 'a' + M, c[M]);
			c[M] = 0;
		}
	}
	return 0;
}

法三:二维数组,数值与下标同时排序

ROW == 2的二维数组,一行次序,一行数字
注意:

#include<ctype.h>
#include<stdio.h>
#define COL 128
void sort(int a[][COL])
{
	int flag, i, j, t;
	for (i = 0; i < COL; i++)
	{
		flag = 1;
		for (j = 1; j < COL - i; j++)
		{
			if (a[0][j - 1] < a[0][j])
			{
				t = a[0][j - 1];
				a[0][j - 1] = a[0][j];
				a[0][j] = t;

				t = a[1][j - 1];
				a[1][j - 1] = a[1][j];
				a[1][j] = t;

				flag = 0;
			}
		}
		if (flag)
			return;
	}
}
int main()
{
	char s[] = "5B3aA+4-HDEH5DH?";
	int a[2][128] = { 0 };
	for (int i = 0;i < 128; i++)
		a[1][i] = i + 1;
	for (int i = 0; i < strlen(s) - 1; i++)
	{
		if (isalpha(s[i]))
			a[0][s[i]-1]++;
	}
	sort(a);
	for (int i = 0; i <128; i++)
	{
		if (a[0][i])
			printf("%c %d\n", a[1][i], a[0][i]);
	}
	return 0;
}

法四:qsort排序,三数组法输出

#include<ctype.h>
#include<stdio.h>
#include<string.h>
int cmp(const void* a, const void* b)
{
	return *(int*)b - *(int*)a;
}
int main()
{
	char s[] = "5B3aA+4-HDEH5DH?";
	int a[128] = { 0 }, b[128] = { 0 }, c[128] = { 0 };
	for (int i = 0; i < strlen(s) - 1; i++)
	{
		if (isalpha(s[i]))
		{
			a[s[i]]++;
			b[s[i]]++;
        }
	}
	qsort(a, 128, 4, cmp);
	for (int i = 0; i < 128; i++)
	{
		for (int j = 0; j < 128; j++)
		{
			if (!c[j] && b[j] != 0 && a[i] == b[j])
			{
                c[j] = 1;
				printf("%c %d\n", j, b[j]);
			}
		}
	}
	return 0;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 对不起,我是语言模型AI,无法使用中文回复。以下是该问题的答案: 可以使用Python语言来实现这个功能。具体代码如下: ```python s = input("请输入一个字符串:") d = {} for c in s: if c.isalpha(): d[c] = d.get(c, ) + 1 items = list(d.items()) items.sort(key=lambda x: x[1], reverse=True) for i in range(len(items)): print(items[i][], "出现了", items[i][1], "次") ``` 代码解释: 1. 首先,使用`input()`函数获取用户输入的字符串。 2. 然后,定义一个空字典`d`,用于存储每个字母出现次数。 3. 接着,使用`for`循环遍历字符串中的每个字符。如果该字符字母,则在字典`d`中将该字母的计数器加1。 4. 使用`items()`函数将字典`d`转换为元组列表,并使用`sort()`函数按照元组的第二个元素(即字母出现次数)进行降序排序。 5. 最后,使用`for`循环遍历排序后的元组列表,并输出每个字母出现次数。 例如,如果用户输入字符串`hello world`,则程序将输出: ``` l 出现了 3 次 o 出现了 2 次 e 出现了 1 次 h 出现了 1 次 d 出现了 1 次 r 出现了 1 次 w 出现了 1 次 ``` ### 回答2: 这个问题需要用到字符串处理和数据统计的知识。首先,我们可以通过遍历字符串的每个字符,使用一个计数器来统计字母出现次数。我们可以使用一个字典来存储每个字母出现次数,通过键-值对的形式来实现。具体的实现如下: ``` def count_letters(s): # 创建空字典 letter_count = {} # 遍历字符串 for char in s: # 如果字符不是字母,就跳过 if not char.isalpha(): continue # 将字符转换成小写字母 char = char.lower() # 如果字母已经在字典中,就将计数器加1 # 否则,将该字母作为新的键,并将计数器初始化为1 if char in letter_count: letter_count[char] += 1 else: letter_count[char] = 1 # 排序字典,按照值从大到小排序 sorted_letter_count = sorted(letter_count.items(), key=lambda x: x[1], reverse=True) # 输出结果 for letter, count in sorted_letter_count: print(f"{letter}: {count}") ``` 上述函数首先创建一个空字典 `letter_count`,然后我们遍历输入的字符串 `s` 中每个字符。如果该字符不是字母,我们就跳过该字符。接着,我们将字符转换为小写,然后检查该字母是否已经在字典 `letter_count` 中出现过。如果是,就将该字母的计数器加1;如果不是,就将该字母加入字典,并将计数器初始化为1。 统计完所有字母出现次数后,我们将字典按照值从大到小排序,然后将结果输出。为了方便起见,我们在输出时将字母和它的计数器用冒号分隔。输出的结果类似于: ``` e: 6 r: 4 t: 4 a: 3 s: 3 n: 2 o: 2 u: 2 b: 1 c: 1 d: 1 f: 1 g: 1 h: 1 i: 1 j: 1 k: 1 l: 1 m: 1 p: 1 q: 1 v: 1 w: 1 x: 1 y: 1 z: 1 ``` 这就是如何实现统计字符串中各个字母出现次数的方法。我们可以尝试在输入任何字符串时使用该函数,以得到它们中各个字母出现频率。 ### 回答3: 这是一个比较常见的字符串处理问题,我们可以从以下几个步骤来解决: 1. 接收字符串输入 首先,我们需要从用户接收一个字符串输入。这可以通过各种方式实现,例如从标准输入读取、从文件读取或从网络接收。 2. 统计字符出现次数 接下来,我们需要遍历整个字符串,并统计每个字符出现次数。一种简单的方法是创建一个长度为26的数组,按字母顺序依次存储每个字母出现次数。具体实现中,可以使用ASCII码来计算每个字符在数组中的位置。 3. 按字符出现次数排序 统计字符出现次数后,我们需要按照各个字符出现次数从大到小排序。这可以通过冒泡排序、插入排序、快速排序等算法实现。 4. 输出结果 最后,我们可以按照字符出现次数从大到小输出结果。这可以通过遍历排序后的数组实现,输出时需要将ASCII码转换为对应的字符。 总体而言,这是一个比较简单的问题,我们可以使用各种编程语言实现。然而,需要注意的是,对于全局化和本地化字符和编码,字符串处理的精度和准确性要求更高。例如,在中文环境下,字符的处理可能会受到编码、字节顺序或字符集等因素的影响。因此,在编写字符串处理程序时,需要考虑到这些因素,以确保其正确性和可靠性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿猿收手吧!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值