查找字符数组中出现次数最多的字符

本文讲述了在杭州大搜车面试中遇到的一道字符算法题,要求在给定字符数组中找出出现次数最多的字符,若次数相同则取出现较早的。文中提供了两种解决方案,一种利用Map保持字符及其出现次数,另一种通过排序和双指针查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天杭州大搜车面试,面试官出了一道字符算法题,如下:
给定一个字符数组,例如char[] chars = { 'a', 'b', 'b', 'b', 'b', 'c', 'a', 'a', 'a'};
找出数组中出现次数最多的字符,如果存在相同次数的字符,取出现较早者。
一个问题的解决方案有多种,我当时说了两种(手写了第一种):

  • 利用数据结构的特性,链表保证了插入顺序,Map正是我们想要的字符与出现次数对应关系的映射,代码如下,只需遍历一次
    	char[] chars = {
         'a', 'b', 'b', 'b', 'b', 'c', 'a', 'a', 'a'};
    	Map<Character, Integer> countMap = new LinkedHashMap<>();
    	Map<Character, Integer> indexMap = new LinkedHashMap<>();
    	int length = chars.length;
    	// 目标字符
    	char target = 0;
    	// 出现的最多次数
    	int maxCount = 0;
    	for (int index = 0; index < length; index++) {
         
    		char aChar &#
在 C 语言中,查找字符数组中出现次数最多的字母并按照字母表顺序输出,可以使用哈希表(如数组或结构体)来记录每个字母及其出现次数,然后遍历一次数组。以下是步骤: 1. 定义一个结构体 `CountChar`,包含字母(char)和计数(int)两个字段: ```c typedef struct { char letter; int count; } CountChar; ``` 2. 初始化一个空的 `CountChar` 数组,长度等于ASCII码最大值减去最小值加1,用于存储所有可能的字母以及它们出现的次数: ```c CountChar countTable[26] = {0}; ``` 3. 遍历输入的字符数组,对每个字符执行以下操作: - 将字符转换为小写字母,以便忽略大小写的差异。 - 计算当前字符对应的索引(`'a'-'A'`)。 - 如果该索引处的计数为0,表示第一次遇到这个字母,初始化其计数为1。 - 否则,将计数加一。 4. 遍历结束后,找到最大计数值的位置,即出现次数最多的字母的索引。由于我们只关心最常见的字母,不需要维护完整的频率数组。 5. 根据索引找到字母,并按字母表顺序输出,同时检查是否有多个字母出现次数最多,如果存在,则输出所有这样的字母。 下面是伪代码示例: ```c for (i = 0; i < strlen(input); i++) { char currentChar = tolower(input[i]); if (currentChar >= 'a' && currentChar <= 'z') { countTable[currentChar - 'a'].count++; } } int maxCount = 0; for (i = 0; i < 26; i++) { if (countTable[i].count > maxCount) { maxCount = countTable[i].count; } } // 找到出现次数最多的字母 for (i = 0; i < 26; i++) { if (countTable[i].count == maxCount) { printf("%c", countTable[i].letter); } } ``` 注意:这种方法适用于单字节编码的字符集(如ASCII)。对于UTF-8等多字节编码,需要处理更复杂的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值