题目:

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

思路:

1、暴力遍历

从头开始扫描字符串中的每个字符,当访问某个字符时,取该字符与后面的每个字符相比较,如果没有重复的字符,那么该字符就是第一个只出现一次的字符。

时间复杂度:O(n^2)

2、Hash

通过hash表来记录字符串中每个字符出现的次数,hash表可以通过一个长度为256的数组来实现,因为字符是一个长度为8的数据类型,总共有256种可能。

(注意:char数据类型的表示范围为-128-127,unsigned char数据类型的表示范围为0-255,需明确字符串中的字符属于哪个范围,这里只考虑大于0的)

第一遍扫描字符串,每扫描一个字符就在hash表中相应位置上+1,记录下每个字符出现的次数;

第二遍扫描字符串,每扫描一个字符就从hash表中得到该字符出现的次数,如果为1,则该字符为第一个只出现一次的字符。

代码:

#include <iostream>

using namespace std;

char firstNotRepeatingChar(char* pString){
if(pString==NULL)
return '\0';
const int tableSize=256;
unsigned int hashTable[tableSize];
for(int i=0;i<tableSize;i++)
hashTable[i]=0; char* pHashKey=pString;
while(*pHashKey!='\0'){
hashTable[*pHashKey-'0']++;
pHashKey++;
} pHashKey=pString;
while(*pHashKey!='\0'){
if(hashTable[*pHashKey-'0']==1)
return *pHashKey;
pHashKey++;
}
return '\0';
} int main()
{
char str[]="abacbd";
cout << firstNotRepeatingChar(str) << endl;
return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/1c82e8cf713b4bbeb2a5b31cf5b0417c?rp=2

在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符。

AC代码:

class Solution {
public:
int FirstNotRepeatingChar(string str) {
if(str.size()<=0)
return -1;
const int tableSize=26;
int hashTable[tableSize];
for(int i=0;i<tableSize;i++)
hashTable[i]=0; for(unsigned int i=0;i<str.size();i++)
hashTable[str[i]-'A']++;
for(unsigned int i=0;i<str.size();i++){
if(hashTable[str[i]-'A']==1)
return i;
}
return -1;
}
};
class Solution {
public:
int FirstNotRepeatingChar(string str) {
if(str.size()<=0)
return -1;
const int tableSize=256;
int hashTable[tableSize];
for(int i=0;i<tableSize;i++)
hashTable[i]=0; for(unsigned int i=0;i<str.size();i++)
hashTable[str[i]]++;
for(unsigned int i=0;i<str.size();i++){
if(hashTable[str[i]]==1)
return i;
}
return -1;
}
};

(剑指Offer)面试题35:第一个只出现一次的字符的更多相关文章

  1. 剑指Offer - 九度1283 - 第一个只出现一次的字符

    剑指Offer - 九度1283 - 第一个只出现一次的字符2013-11-21 21:13 题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出 ...

  2. 【Java】 剑指offer(50-1) 字符串中第一个只出现一次的字符

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在字符串中找出第一个只出现一次的字符.如输入"abacc ...

  3. 剑指offer(34)第一个只出现一次的字符

    题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置 题目分析 只需要用map记录字符出现的次数就行,比较简单的题 代码 f ...

  4. 【剑指Offer】34、第一个只出现一次的字符

      题目描述:   在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).   解题思路: ...

  5. C++版 - 剑指Offer 面试题35:第一个只出现一次的字符 解题报告(华为OJ034-找出字符串中第一个只出现一次的字符)

    面试题35:第一个只出现一次的字符 题目:在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b.(2006年google的一道笔试题.) 分析: 首先应向确认一下是ASCII字 ...

  6. 剑指offer 面试题35.复杂链表的复制

    时间O(N),空间O(N) /* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomList ...

  7. 剑指offer 面试题56. 数组中只出现一次的两个数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 方法1:用set记录出现过的数字 class Solution { public: void F ...

  8. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  9. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  10. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

随机推荐

  1. Excel 之查找与替换

    Excel查找与替换 1,一旦学会查找,替换就简单了. 2,查找下面有一个选项,里面有对查找的范围进行限制 3,你可以选中一个区域,然后再查找,查找只会在你选择的区域里面进行 4,查找只能找特定值,而 ...

  2. 警惕VPS服务商常用的超售手段

    任何商业企业都希望将利益最大化,这是可以理解的.但如果做的过火最终损害的还是自己的利益.VPS服务提供商也一样,为了将利益最大化,他们往往会实用技术手段对所出售的VPS进行“超售”. 那么何谓“超售” ...

  3. jboss集成eclipse

    eclipse Kepler + Jboss7.1 参考引用文档: http://www.tekdigest.com/how-to-install-jboss-tools-in-eclipse.htm ...

  4. css overflow:hidden无效解决办法

    解决方案:只需要在设定overflow:hidden层加入定位即可 position:relative;left:0px;top:0px

  5. hdu 5423 Rikka with Tree(dfs)bestcoder #53 div2 1002

    题意: 输入一棵树,判断这棵树在以节点1为根节点时,是否是一棵特殊的树. 相关定义: 1.  定义f[A, i]为树A上节点i到节点1的距离,父节点与子节点之间的距离为1. 2.  对于树A与树B,如 ...

  6. Net判断一个对象是否为数值类型 z

    http://www.cnblogs.com/SkyD/p/4053461.html public static bool IsNumeric(this Type dataType) { if (da ...

  7. 实现两个N*N矩阵的乘法,矩阵由一维数组表示

    实现两个N*N矩阵的乘法,矩阵由一维数组表示. 先介绍一下矩阵的加法: void Add(int rows, int cols) { ;i<rows;i++) { ;j<cols;j++) ...

  8. 更新的packages.config所有的软件包?

    1. 你NuGet.exe的恢复你的包.运行的每个项目. nuget install packages.config 或用NuGet的2.7可以恢复所有包中的行. nuget restore Your ...

  9. Linux基本命令(10)其他命令

    其他命令 命令 功能 命令 功能 echo 显示一字串 passwd 修改密码 clear 清除显示器 lpr 打印 lpq 查看在打印队列中等待的作业 lprm 取消打印队列中的作业 10.1 ec ...

  10. 修复duilib CEditUI控件和CWebBrowserUI控件中按Tab键无法切换焦点的bug

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41556615 在duilib中,按tab键会让焦点在Button一类的控 ...