剑指Offer面试题50:第一个只出现一次的字符

题目一:

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

解题思路:这里应该是考察set,map,unordered_set,unordered_map,multiset,multimap等容器的用法。

                    set和multiset会根据特定的排序准则,自动将元素进行排序。不同的是后者允许元素重复而前者不允许。

                    也可以采用构建哈希表的方法来实现

解题代码:

            1.使用map实现(map底层基于红黑树实现)

PS:map与unordered_map相比:

       map底层实现为红黑数,undered_map底层实现为哈希表,两者均不能有重复的建,均支持[ ]运算符

       map与multimap相比:   两者底层实现均为红黑树,但是multimap支持重复的键,不支持[ ]运算符

       set容器类似,set容器里面:key(关键字)就是value(值)。而map容器是key-value(键-值对)。

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        if(str.size()<=0)
            return -1;
        map<char,int> mp;
        for(int i=0; i<str.size(); i++)
            mp[str[i]]++;
        for(int i=0; i<str.size(); i++)
            if(mp[str[i]]==1)
                return i;
        return -1;
    }
};

题目二:

题目描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

输出描述:

如果当前字符流没有存在出现一次的字符,返回#字符。

解题思路:使用哈希表,或者特定的容器

解题代码:

      1.采用自建哈希表的方法

class Solution
{
public:
    string s;
    char hash[256]={0};  //自建哈希表,字符char型占1个字节,可以存1字节范围内的整型
  //Insert one char from stringstream
    void Insert(char ch)
    {
        s+=ch;
        hash[ch]++;      //利用字符的ASCII码作为位置索引
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
        int size=s.size();
        for(int i=0; i<size; i++)
            if(hash[s[i]]==1)
                return s[i];
        
        return '#';
    }
};

    2.使用标准库STL容器来实现 (map,unordered_map底层是用哈希表实现的)

class Solution
{
public:
    map<char,int> a;
    vector<char> b;
  //Insert one char from stringstream
    void Insert(char ch)
    {
        b.push_back(ch);
        a[ch]++;
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
        int i;
        for(i=0;i<b.size();i++)
        if(a[b[i]]==1) 
            return b[i];
        
         return '#';
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值