面试100题-4
2013-01-15 09:56
176 查看
题目:在一个字符串中找到第一个只出现一次的字符,如输入abaccdeff,则输出b
(Google 2006)
分析:如果只是从头到尾的比较每个字符以及它后面到末尾的字符,这样时间复杂度会达到
O(n2),这样的代码肯定不行,应该继续寻找优化的算法
因为字符串是由一个个字符组成的,而每一个字符在ASCII表中都对应自己的ASCII值,这样
就转化成了一个hash表,其中每个字符是key,每个字符在字符串中出现的次数为value
然后问题转化成了,在这个hash表中寻找出value是1的key,如果有多个满足条件的字符,则
输出第一个
因为hash表按照字符顺序来,所以直接遍历寻找,找到的第一个即为题目要求
写出实现这个功能的函数即可,前面加上必要的注释,体现出良好的代码习惯和风格
总结:1.要熟悉基本的数据类型占的字节,位数,分不同的32位和64位机器
2.在数据结构方面要联想到容器,哈希表,映射,计数等这些关键的点
3.实现功能时要考虑到输入和输出的要求
(Google 2006)
分析:如果只是从头到尾的比较每个字符以及它后面到末尾的字符,这样时间复杂度会达到
O(n2),这样的代码肯定不行,应该继续寻找优化的算法
因为字符串是由一个个字符组成的,而每一个字符在ASCII表中都对应自己的ASCII值,这样
就转化成了一个hash表,其中每个字符是key,每个字符在字符串中出现的次数为value
然后问题转化成了,在这个hash表中寻找出value是1的key,如果有多个满足条件的字符,则
输出第一个
因为hash表按照字符顺序来,所以直接遍历寻找,找到的第一个即为题目要求
写出实现这个功能的函数即可,前面加上必要的注释,体现出良好的代码习惯和风格
/* //Function:Find the first character which appears only one time in a string //Input: the string //Output:the character */ char FindFirstChar(char * str) { if(str == NULL) return 0; const int size = 256; int hashtable[size]; for(int i=0; i<size; i++) hashtable[i] = 0; char * ch = str; while(ch != '\0') { hashtable[*(ch++)]++; } char * result = str; while(result != '\0') { if(hashtable[*result] == 1) return *result result++; } return 0; }
总结:1.要熟悉基本的数据类型占的字节,位数,分不同的32位和64位机器
2.在数据结构方面要联想到容器,哈希表,映射,计数等这些关键的点
3.实现功能时要考虑到输入和输出的要求
相关文章推荐
- 面试 (一) : iOS基础篇-6(100题81~100)
- 面试100题系列之2字符串删除多余空格
- 第八题各小题汇总 【微软面试100题 第八题】
- 从上往下打印二叉树 【微软面试100题 第十六题】
- 栈的push、pop序列 【微软面试100题 第二十九题】
- 面试100题系列之17模拟比赛
- 斐波拉契数列 【微软面试100题 第十九题】
- 求比赛名次 【微软面试100题 第三十六题】
- 括号问题 【微软面试100题 第四十六题】
- 微软面试100题
- 微软等面试100题答案精选
- 调整数组顺序使奇数位于偶数前面 【微软面试100题 第五十四题】
- 精选微软经典的算法面试100题
- 从尾到头输出链表 【微软面试100题 第五十八题】
- 在字符串中删除特定的字符 【微软面试100题 第六十三题】
- 两个闲玩娱乐 【微软面试100题 第六十七题】
- 永久勘误:微软等面试100题答案V0.3版[第21-40题答案]
- [整理II]精选微软等公司数据结构+算法面试100题 [第41-60题]
- 链表和数组的区别在哪里 【微软面试100题 第七十八题】
- C语言库函数实现 【微软面试100题 第八十三题】