程序员面试题精选100题(13)-第一个只出现一次的字符[算法]
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
分析:这道题是2006年google的一道笔试题。
看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路时间复杂度是O(n2)。我们试着去找一个更快的方法。
由于题目与字符出现的次数相关,我们是不是可以统计每个字符在该字符串中出现的次数?要达到这个目的,我们需要一个数据容器来存放每个字符的出现次数。在这个数据容器中可以根据字符来查找它出现的次数,也就是说这个容器的作用是把一个字符映射成一个数字。在常用的数据容器中,哈希表正是这个用途。
哈希表是一种比较复杂的数据结构。由于比较复杂,STL中没有实现哈希表,因此需要我们自己实现一个。但由于本题的特殊性,我们只需要一个非常简单的哈希表就能满足要求。由于字符(char)是一个长度为8的数据类型,因此总共有可能256 种可能。于是我们创建一个长度为256的数组,每个字母根据其ASCII码值作为数组的下标对应数组的对应项,而数组中存储的是每个字符对应的次数。这样我们就创建了一个大小为256,以字符ASCII码为键值的哈希表。
我们第一遍扫描这个数组时,每碰到一个字符,在哈希表中找到对应的项并把出现的次数增加一次。这样在进行第二次扫描时,就能直接从哈希表中得到每个字符出现的次数了。
参考代码如下:
///
// Find the first char which appears only once in a string
// Input: pString - the string
// Output: the first not repeating char if the string has, otherwise 0
///
char FirstNotRepeatingChar(char* pString)
{// invalid inputif(!pString)return 0;// get a hash table, and initialize it constint tableSize = 256;unsignedint hashTable[tableSize];for(unsignedint i = 0; i < tableSize; ++ i)hashTable[i] = 0;// get the how many times each char appears in the stringchar* pHashKey = pString;while(*(pHashKey) != '\0')hashTable[*(pHashKey++)] ++;// find the first char which appears only once in a stringpHashKey = pString;while(*pHashKey != '\0'){if(hashTable[*pHashKey] == 1)return *pHashKey;pHashKey++;}// if the string is empty // or every char in the string appears at least twicereturn 0;
}
本文已经收录到《剑指Offer——名企面试官精讲典型编程题》一书中,有改动,书中的分析讲解更加详细,列举了同类型可以用简单哈希表解决的字符串问题,达到举一反三的目的。欢迎关注。
本题已被九度Online Judge系统收录,欢迎读者移步到http://ac.jobdu.com/hhtproblems.php在线测试自己的代码。
博主何海涛对本博客文章享有版权。网络转载请注明出处http://zhedahht.blog.163.com/。整理出版物请和作者联系。对解题思路有任何建议,欢迎在评论中告知,或者加我微博http://weibo.com/zhedahht或者http://t.163.com/zhedahht与我讨论。谢谢。
程序员面试题精选100题(13)-第一个只出现一次的字符[算法]相关推荐
- [程序员面试题精选100题]13.第一个只出现一次的字符
[题目] 在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b. [分析] [代码] /********************************* * 日期:2013- ...
- 程序员面试题精选100题(34)-数组中只出现一次的数字[算法]
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 分析:这是一道很新颖的关于位运算的面试题. 首先我们 ...
- 程序员面试题精选100题(22)-整数二进制表示中1的个数[算法]
题目:输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析:这是一道很基本的考查位运算的面试题.包括微软在内的很多公司都曾采用过这道题 ...
- 程序员面试题精选100题(29)-调整数组顺序使奇数位于偶数前面[算法]
题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.要求时间复杂度为O(n). 分析:如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...
- 程序员面试题精选100题(55)-不用+、-、×、÷做加法[算法]
题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+.-.×.÷. 分析:这又是一道考察发散思维的很有意思的题目.当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关 ...
- 程序员面试题精选100题
程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树 ...
- 程序员面试题精选100题(51)-顺时针打印矩阵
// 程序员面试题精选100题(51)-顺时针打印矩阵.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostre ...
- 程序员面试题精选100题:求从1到n的正数中1出现的次数
// 程序员面试题精选100题(25):求从1到n的正数中1出现的次数 // 如 f(253) = (2!=0) * 100 + 2 * f(99) + (5!=0) * 10 + 5 * f(9) ...
- 程序员面试题精选100题:41-50解题报告
程序员面试题精选100题(41)-把数组排成最小的数[算法] 题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{32, 321},则输出这两个能 ...
最新文章
- arraylist 后往前遍历_Java集合框架之ArrayList
- 动态规划:求最长公共子序列和最长公共子串
- HBase停止集群报错,pid: No such file or directory
- jquery全局变量_jQuery源码一个小细节,却很好地体现了性能优化的思想,很优秀...
- 大湾区足球联赛港澳赛区上演进球大战
- Android Binder 分析——匿名共享内存(好文)
- CSR8670项目实战:BlueSiri轻智能蓝牙音箱
- 微信小程序简单爱心点赞动画
- Epubor Ultimate for mac(mac电子书转换软件)
- 基于android平台的语音机器人服务娱乐系统
- wincc实现手机APP远程监控
- 电脑分区不小心格式化了文件恢复教程
- 【Android,CustomWidget】Chip:那些搜索记录和好评中的Chips组件
- HDLC广域网协议设置
- 广告投放方案-精准广告投放方案应该怎么做?
- 应用白名单:方法与挑战
- 使用存储过程实现循环更新3组数组中的数据
- PCB电路设计的14个误区
- BI和大数据的区别在哪里?
- 如何在WIN7的64b的环境下安装Arduino Leonardo的驱动(傻瓜式教程)
热门文章
- Quartz-TriggerListener解读
- java投票输出票数最高前三名,给你喜欢的作品投票,票数前三名获本平台赠送书一本。|诗花朵朵...
- php获取表单$_files,PHP中$_FILES的使用方法及注意事项说明
- 使用Kotlin写脚本
- 2021-04-15 深入理解SLAM技术 【2】 SLAM的框架
- 微信小程序电商实战-商品列表流式布局
- MATLAB-冒号符号
- 【新星计划】Matlab绘制分岔图
- linux time shell统计脚本运行时间
- displaynone符合html5标准,javascript – JS HTML5验证“display:none”必需的输入元素