zoukankan      html  css  js  c++  java
  • 第一个只出现一次的字符

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

    方法一:从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路时间复杂度是O(n2)。我们试着去找一个更快的方法。
         

    方法二:由于题目与字符出现的次数相关,我们是不是可以统计每个字符在该字符串中出现的次数?要达到这个目的,我们需要 一个数据容器来存放每个字符的出现次数。在这个数据容器中可以根据字符来查找它出现的次数,也就是说这个容器的作用是把一个字符映射成一个数字。在常用的 数据容器中,哈希表正是这个用途。
          哈希表是一种比较复杂的数据结构。由于比较复杂,STL中没有实现哈希表,因此需要我们自己实现一个。但由于本题的特殊性,我们只需要一个非常简单的哈希表就能满足要求。由于字符(char)是一个长度为8的数据类型,因此总共有可能256 种可能。于是我们创建一个长度为256的数组,每个字母根据其ASCII码值作为数组的下标对应数组的对应项,而数组中存储的是每个字符对应的次数。这样我们就创建了一个大小为256,以字符ASCII码为键值的哈希表。(并不仅限于英文字符,所以这里要考虑256种可能)。
          我们第一遍扫描这个数组时,每碰到一个字符,在哈希表中找到对应的项并把出现的次数增加一次。这样在进行第二次扫描时,就能直接从哈希表中得到每个字符出现的次数了。

    方法一代码如下:

    void search(char a[])
    {
        int len=strlen(a);
        int k=0;
        for(int i=0;i<len;i++)
        {
            for(int j=0;j<len;j++)
               if(a[i]==a[j]&&i!=j)
                   k=1;
            if(k==0)
            {
                cout<<a[i]<<endl;
                return;
            }
            k=0;
        }
    }

    方法二 代码如下:

    void find(char a[])
    {
        int count[256]={0};
        char *pstr=a;
        while((*pstr)!='')
        {
            count[*(pstr++)]++;
        }
        pstr=a;
        while(*pstr!='')
        {
            if(count[*pstr]==1)
               {
                  cout<<*pstr<<endl;
                  break;
               }
    
            pstr++;
    
        }
    }
  • 相关阅读:
    oracle中Blob和Clob类型的区别
    为什么要分库分表
    Enable file editing in Visual Studio's debug mode
    SQL Server Dead Lock Log
    Debug .NET Framework Source
    SQL Server text field里面有换行符的时候copy到excel数据会散乱
    诊断和修复Web测试记录器(Web Test Recorder)问题
    Can't load Microsoft.ReportViewer.ProcessingObjectModel.dll
    'telnet' is not recognized as an internal or external command
    Linq to XML
  • 原文地址:https://www.cnblogs.com/wft1990/p/6961426.html
Copyright © 2011-2022 走看看