• 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高

  • 相关阅读:
    select2 下拉搜索 可编辑可搜索 / 只可搜索
    获取服务器时间ajax
    table中td 内容超长 自动折行 (含字母数字文字)
    下拉菜单 ,三级联动 ,夹其它下拉菜单
    echarts 添加标线,设置颜色
    table 中的tr 行点击 变换颜色背景
    checkebox 全选 ,子复选框单个全部选择后,全选框也会被选择
    replace替换,全局和局部替换
    字断行
    ydoc 参考系列
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/10551673.html
Copyright © 2020-2023  润新知