• 【算法19】第一个只出现一次的字符


    【题  目】在一个字符串找到第一个只出现一次的字符。例如:输入字符串abaccdeff,输出b。

    【思 路1】其实我看到这道题的第一个反应就是哈希表呀!当然我是学习过哈希表之后才这么说的,对于之前,我们的思路当然是,从头到尾遍历字符串,对于遍历到的每一个字符,拿它后面的每一个字符和它比较,如果没有和它相等的字符,那么它就是我们所要找的。很容看出来这种算法的时间复杂度是O(n2).

    【思 路2】当然哈希表啦!所有学习过哈希表的同学都知道哈希表的查找速度是O(1)。我的第一个反映是建立26个字母的哈希表,当然这没有包含各种标点符号,控制字符等,所以为了全面起见,我们建立长度为256的哈希表(每一个char字符占用8bit,所能表示的种类就只有256种)。有了这个表,下面的就很简单了,首先遍历一遍字符串,就字符的ASCII值作为我们哈希表的键值,而数组中的value值存储每一个字符出现的次数。第二遍遍历字符串,取出第一个value值为1的键值即可。根据这种思路,我们很容易得到如下的代码:

     1 #include<iostream>
    2 #include<string>
    3 #include<cstring>
    4 using namespace std;
    5
    6 char FindFirstNotRepeatedChar(char *pstring)
    7 {
    8 if(pstring == NULL)
    9 return 0;
    10
    11 //定义并初始化哈希表
    12 const int hashLength = 256;
    13 unsigned int hashList[hashLength];
    14 for(int i = 0;i < hashLength;++i)
    15 {
    16 hashList[i] = 0;
    17 }
    18
    19 //第一遍遍历,hash表记录每个字符出现的次数
    20 char *pchar = pstring;
    21 while(*pchar != '\0')
    22 {
    23 hashList[*pchar]++;
    24 pchar++;
    25 }
    26
    27 //指针重新指向字符串的第一个字符
    28 pchar = pstring;
    29
    30 //第二遍遍历,返回第一个次数为1的字符
    31 while(*pchar != '\0')
    32 {
    33 if(hashList[*pchar] == 1)
    34 {
    35 return *pchar;
    36 }
    37
    38 pchar++;
    39 }
    40
    41 //没有只出现一次的字符
    42 return 0;
    43 }
    44
    45 int main()
    46 {
    47 cout<<"please enter your string:"<<endl;
    48 const int maxSize = 100;
    49 char str[maxSize];
    50 cin>>str;
    51
    52 cout<<"the first not repeated char is:"<<endl;
    53 cout<<FindFirstNotRepeatedChar(str)<<endl;
    54
    55 return 0;
    56 }

      运行结果如下:


    References:

    程序员面试题精选100题:http://zhedahht.blog.163.com/blog/static/25411174200722191722430/

    注:

    1)本博客所有的代码环境编译均为win7+VC6。所有代码均经过博主上机调试。

    2)博主python27对本博客文章享有版权,网络转载请注明出处http://www.cnblogs.com/python27/。对解题思路有任何建议,欢迎在评论中告知。

  • 相关阅读:
    典型漏洞归纳之上传漏洞
    典型漏洞归纳之解析漏洞
    Python学习目录
    MySQL数据库优化的八种方式
    深度剖析Flask上下文管理机制
    算法十大排序(含动图)
    设计模式代码实例
    设计模式
    数据结构
    算法基础
  • 原文地址:https://www.cnblogs.com/python27/p/2285379.html
Copyright © 2020-2023  润新知