zoukankan      html  css  js  c++  java
  • 50-02 字符流中第一个不重复的字符( 时间空间效率的平衡)

    题目描述:

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

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

     

    测试用例:

    1)功能测试(读入一个字符,读入多个字符,读入的所有字符都是唯一的,读入的所有字符都是重复出现的)

    2)特殊输入测试(读入0个字符时)

    解题思路:

    1)使用哈希表

    class Solution
    {
    public:
        //定义构造函数
        Solution():index(0){
            for(int i=0;i<256;i++)
                occurrence[i]=-1;  //初始化为-1,表示还字符没有出现过
        }
      //Insert one char from stringstream
        void Insert(char ch)
        {
            if(occurrence[ch]==-1)
                 occurrence[ch]=index;
            else if(occurrence[ch]>=0)  //表示该字符已经出现过一次
                occurrence[ch]=-2;
            index++;
        }
      //return the first appearence once char in current stringstream
        char FirstAppearingOnce()
        {
            //如果字符流为空的时候
            char ch='#';  //认真读题,注意题目要求的返回值
            int minV = numeric_limits<int>::max();  //初始化为int能表示的最大值
            for(int i=0;i<256;i++){
                if(occurrence[i]>=0 && occurrence[i]< minV){
                    ch=char(i); //将ASCII码转为对应的字符
                    minV = occurrence[i];
                }
            }
            return ch;
        
        }
    private:
        int occurrence[256];
        int index;  //表示字符在字符流中的位置
    };
    

    std::numeric_limits为模板类,使用时需要添加头文件#include<limits>

    比较常用的使用是对于给定的基础类型用来判断在当前系统上的最大值、最小值。

    支持的基础算术类型包括如下


    2)其他一些方法,大多是将字符流存起来,string或者vector,然后寻找的时候遍历字符流的所有字符,判断哈希表或者map中字符出现的次数。无论是空间复杂度还是时间复杂度都比方法1高

  • 相关阅读:
    [Cisco答疑]思科产品常见问题问答大汇总
    英语名人名言
    [配置实例]三层交换机组播配置实例
    利用VLAN技术组建三层线速校园网
    神州数码交换机配置基本命令
    SQL命令大全中英文对照
    SQL通用防注入系统3.1 最终纪念版
    带关闭按钮的浮动窗口
    Document方法对比
    HTML元素参考手册
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/10551673.html
Copyright © 2011-2022 走看看