查找字符串中第一个出现一次的字符
2016-05-18 13:18
211 查看
这是《剑指offer》中的一道关于字符串的面试题:
对于一个普通人来说,拿到这个题最先想到的方法估计就是遍历整个字符串,用访问到得字符和其他字符进行比较,咦,如果遇到一个没有和他一样的其他字符,那么我们就返回这个字符。但是这种方法的时间复杂度是o(n2),虽然我们能够想到这样的方法,但我们自己估计都会觉得这种方法low。
剑指offer上面给我们提供了一种比较巧妙的方法,就是我们可以找一个数据的容器,在对应的地方存储某一个字符的出现次数,然后在遍历一次这个容器,遇到存储值为1的时候就返回这个位置所代表的字符。这样的方法可能聪明的人会往这样的方向想,但是要想用一个对应的位置代表一个字符可能觉得很有难度。剑指offer告诉我们可以用一个很简单的哈希表就能实现,简单地说就是我们可以新建一个数组,因为一个字符长度为8,总共有256种可能,那么我们所创建的数组大小就是256.每一个字符的ASCII码值作为数组下标都对应某一个值,所对应的值就是之后我们遍历原字符串存储进去的这个字符的出现次数,然后在遍历一次字符串,同时看这个字符在刚才的那个数组中对应位置所存的值,也就是它的出现次数是不是1,如果是1的话就将此值返回为我们要寻找的第一个出现一次的字符。 大功告成。
详细讲解大家可以再去翻翻剑指offer。
对于一个普通人来说,拿到这个题最先想到的方法估计就是遍历整个字符串,用访问到得字符和其他字符进行比较,咦,如果遇到一个没有和他一样的其他字符,那么我们就返回这个字符。但是这种方法的时间复杂度是o(n2),虽然我们能够想到这样的方法,但我们自己估计都会觉得这种方法low。
剑指offer上面给我们提供了一种比较巧妙的方法,就是我们可以找一个数据的容器,在对应的地方存储某一个字符的出现次数,然后在遍历一次这个容器,遇到存储值为1的时候就返回这个位置所代表的字符。这样的方法可能聪明的人会往这样的方向想,但是要想用一个对应的位置代表一个字符可能觉得很有难度。剑指offer告诉我们可以用一个很简单的哈希表就能实现,简单地说就是我们可以新建一个数组,因为一个字符长度为8,总共有256种可能,那么我们所创建的数组大小就是256.每一个字符的ASCII码值作为数组下标都对应某一个值,所对应的值就是之后我们遍历原字符串存储进去的这个字符的出现次数,然后在遍历一次字符串,同时看这个字符在刚才的那个数组中对应位置所存的值,也就是它的出现次数是不是1,如果是1的话就将此值返回为我们要寻找的第一个出现一次的字符。 大功告成。
详细讲解大家可以再去翻翻剑指offer。
#include <stdio.h> #include<windows.h> #define size 256 char Findchar(char* pstr) { int hashtable[size] = {0}; char *phashkey = pstr; if (pstr == NULL) { return '\0'; } while (*phashkey != '\0') { hashtable[*phashkey]++; phashkey++; } phashkey = pstr; while (*phashkey != '\0') { if (hashtable[*phashkey] == 1) { return *phashkey; } phashkey++; } return '\0'; } int main() { char *str = "zccadd"; char ch = Findchar(str); printf("%c", ch); system("pause"); return 0; }
相关文章推荐
- 顺序查找
- [Python]第八讲:dict与set
- common-beanutils包下反射获取bean属性值
- JAXB - XML Schema Types, Date and Time
- ListView的性能优化之convertView和viewHolder
- hjr-DSP:CMD文件
- 学会进程管理,人生迎来新高度,&, [Ctrl]-z, fg, bg, kill, killall, nohup
- 【wpf WebBrowser 清空网站的Cookie&Session 清空用户登录状态】
- Volley
- Spark性能相关参数配置详解-任务调度篇
- hibernate_detachedCateria_Disjunction(多条件or)
- MySQL导入.sql文件以及#1146 - Table 'hibernate.person_email' doesn't exist
- [剑指offer]删除链表中重复的结点
- 历年错题集2015
- cmd.ExecuteNonQuery()、cmd.ExecuteScalar()、cmd.ExecuteReader()
- 修改键值映射
- Material Design之CollapsingToolbarLayout 相关属性和方法介绍
- 腾讯微云下线同步盘功能
- 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
- java实现抓取某公司官网新闻