[面试] 算法(二)—— 第一个出现一次的字符(第一个出现 k 次、出现最多次)

来源:互联网 发布:广州住宅成交数据 编辑:程序博客网 时间:2024/05/22 01:53

+ :=

题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出“b”。

最直观的想法自然是从头到尾扫描这个字符串中的每个字符,当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面未发现重复的字符,则该字符就是只出现一次的字符。

一如文章开头所说,算法并不单独构成算法,连同其时间复杂度分析共同构成算法。

如果字符串有 n 个字符,第 i 个字符,就需与其后的 ni 个字符相比较,显然此时的时间复杂度为 O(n2),面试官不会满意这种思路。

由于题目与字符出现的次数相关,我们是不是可以统计每个字符在该字符串中出现的次数?(次数统计是一件时间复杂度为 O(n) 的事)。要达到这一目的,我们需要一个数据容器来存放每个字符出的出现次数。在这个数据容器中可以根据字符来查找其出现的次数,也就是这个容器的作用是把一个字符映射为一个数字(其在字符串中出现的次数),在常用的数据容器中,哈希表正是这一用途。

为了解决这一问题,我们可以定义哈希表的键(Key)是字符,而值(Value)为该字符出现的次数。同时,我们还需要扫描字符串两次

  • (1)第一次扫描字符串,是为了建立每一个字符的统计计数,也即是为了建表。
  • (2)第二次扫描是为了找到出现次数符合要求的字符并返回,也即是为了查表。

哈希表是一种比较复杂的数据结构,并且 C++ 的标准模板库(STL)中并没有实现哈希表。接下来我们要考虑的问题是如何实现哈希表。由于本题的特性,我们只需一个非常简单的哈希表即可满足需求。字符(char)是一个长度为 8 的数据类型,因此总共有 256 种可能。于是我们创建一个长度为 256 的数组,每个字母根据其 ASCII 码值作为数组的下标对应数组的一个数字,而数组中存储的是每个字符出现的次数。这样我们就创建了一个大小为 256,以字符 ASCII 码(类型转换)为键值的哈希表。

char FirstNotRepeatingChar(char* pStr){    if (pStr == NULL)        return '\0';    unsigned int hashTable[256] = {0};    char* pHashStr = pStr;    while (*pHashStr != '\0')        ++hashTable[*pHashStr++];    pHashStr = pStr;    while (*pHashStr != '\0')    {        if (hashTable[*pHashStr] == 1)            return *pHashStr;        ++pHashStr;    }    return '\0';}

举一反三

以下的俩个问题,主要改变的是第二次扫描(也即查表的过程)

  • (1)第一个出现两次的字符,以及出现 k 次的字符

    while (*pHashStr == k)    ...
  • (2)出现最多次的字符

    unsigned int maxTimes = 0;char maxTimesChar = '\0';while (*pHashStr != '\0'){    if (maxTimes < hashTable[*pHashStr])    {        maxTimes = hashTable[*pHashTable];        maxTimesChar = *pHashTable;    }    ++pHashTable;}return maxTimesChar;
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 由于经济原因心态不好怎么办 公司经济不好不裁员怎么办 家里经济不好没有钱怎么办 银行柜员找不到工作怎么办 在球队中打替补怎么办 大学生毕业后找不到工作怎么办 30岁不敢换工作怎么办 投完简历没回复怎么办 工业废气一年总量超标怎么办 安监局行政处罚没能力交怎么办 被社会淘汰的人怎么办 宝宝吐奶的时候怎么办 网友要我发红包怎么办 电脑久了很慢怎么办 影驰显卡花屏怎么办 反恐精英全球攻势加载地图慢怎么办 老滚5视角锁死了怎么办 苹果描述文件没有了怎么办 苹果6s发热严重怎么办 苹果6s发烫严重怎么办 手机型号不适配全军出击怎么办? 苹果5版本过低怎么办 在泰国买到假货怎么办 在泰国旅游遇到危险该怎么办? 拾到小米手环怎么办 苹果充电打游戏触点怎么办 衣服上金属锈了怎么办 光之子门锁住了怎么办 挖到金矿石了该怎么办 邻居是精神病扔石头怎么办 汽车保养手册丢了怎么办 五号电池没电了怎么办 电脑打印时显示脱机怎么办 博新计划两年后怎么办 门帘粘扣老是掉怎么办 魔术粘贴带双面背胶不粘了怎么办 斜挎包包磨衣服怎么办 电脑ip被别人知道了怎么办 西乐葆不止痛了怎么办 家里鸽子多捣蛋的不行怎么办 联璧倒闭了理财钱怎么办