题目:在一个字符串中找到第一个只出现一次的字符。如输入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)-第一个只出现一次的字符[算法]相关推荐

  1. [程序员面试题精选100题]13.第一个只出现一次的字符

    [题目] 在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b. [分析] [代码] /********************************* * 日期:2013- ...

  2. 程序员面试题精选100题(34)-数组中只出现一次的数字[算法]

    题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 分析:这是一道很新颖的关于位运算的面试题. 首先我们 ...

  3. 程序员面试题精选100题(22)-整数二进制表示中1的个数[算法]

    题目:输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析:这是一道很基本的考查位运算的面试题.包括微软在内的很多公司都曾采用过这道题 ...

  4. 程序员面试题精选100题(29)-调整数组顺序使奇数位于偶数前面[算法]

    题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.要求时间复杂度为O(n). 分析:如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...

  5. 程序员面试题精选100题(55)-不用+、-、×、÷做加法[算法]

    题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+.-.×.÷. 分析:这又是一道考察发散思维的很有意思的题目.当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关 ...

  6. 程序员面试题精选100题

    程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树   ...

  7. 程序员面试题精选100题(51)-顺时针打印矩阵

    // 程序员面试题精选100题(51)-顺时针打印矩阵.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostre ...

  8. 程序员面试题精选100题:求从1到n的正数中1出现的次数

    // 程序员面试题精选100题(25):求从1到n的正数中1出现的次数 // 如 f(253) = (2!=0) * 100 + 2 * f(99) + (5!=0) * 10 + 5 * f(9) ...

  9. 程序员面试题精选100题:41-50解题报告

    程序员面试题精选100题(41)-把数组排成最小的数[算法]   题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{32,  321},则输出这两个能 ...

最新文章

  1. arraylist 后往前遍历_Java集合框架之ArrayList
  2. 动态规划:求最长公共子序列和最长公共子串
  3. HBase停止集群报错,pid: No such file or directory
  4. jquery全局变量_jQuery源码一个小细节,却很好地体现了性能优化的思想,很优秀...
  5. 大湾区足球联赛港澳赛区上演进球大战
  6. Android Binder 分析——匿名共享内存(好文)
  7. CSR8670项目实战:BlueSiri轻智能蓝牙音箱
  8. 微信小程序简单爱心点赞动画
  9. Epubor Ultimate for mac(mac电子书转换软件)
  10. 基于android平台的语音机器人服务娱乐系统
  11. wincc实现手机APP远程监控
  12. 电脑分区不小心格式化了文件恢复教程
  13. 【Android,CustomWidget】Chip:那些搜索记录和好评中的Chips组件
  14. HDLC广域网协议设置
  15. 广告投放方案-精准广告投放方案应该怎么做?
  16. 应用白名单:方法与挑战
  17. 使用存储过程实现循环更新3组数组中的数据
  18. PCB电路设计的14个误区
  19. BI和大数据的区别在哪里?
  20. 如何在WIN7的64b的环境下安装Arduino Leonardo的驱动(傻瓜式教程)

热门文章

  1. Quartz-TriggerListener解读
  2. java投票输出票数最高前三名,给你喜欢的作品投票,票数前三名获本平台赠送书一本。|诗花朵朵...
  3. php获取表单$_files,PHP中$_FILES的使用方法及注意事项说明
  4. 使用Kotlin写脚本
  5. 2021-04-15 深入理解SLAM技术 【2】 SLAM的框架
  6. 微信小程序电商实战-商品列表流式布局
  7. MATLAB-冒号符号
  8. 【新星计划】Matlab绘制分岔图
  9. linux time shell统计脚本运行时间
  10. displaynone符合html5标准,javascript – JS HTML5验证“display:none”必需的输入元素