博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
50-02 字符流中第一个不重复的字符( 时间空间效率的平衡)
阅读量:4926 次
发布时间:2019-06-11

本文共 1372 字,大约阅读时间需要 4 分钟。

题目描述:

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"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
::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高

 

转载于:https://www.cnblogs.com/GuoXinxin/p/10551673.html

你可能感兴趣的文章
如何使用ajax 提交easyUI form表单
查看>>
XHR
查看>>
第11章 PADS功能使用技巧(1)-最全面
查看>>
最全面精辟的运放应用之半波精密整流电路分析视频教程
查看>>
android获得屏幕高度和宽度
查看>>
extjs修改字段背景颜色
查看>>
数据库读写分离Master-Slave
查看>>
android Spinner的使用
查看>>
php pdo bindValue / bindParam 中不能含有连字符
查看>>
0,null,empty,空,false,isset
查看>>
仿jquery 选择器功能
查看>>
游历魔法王国
查看>>
Nifi-install-config
查看>>
自己写的一个石头剪刀布(只是个初学者)
查看>>
转载一个:【C#4.0】中的dynamic与var的区别-西南烟雨
查看>>
JS 处理浮点型问题
查看>>
cocoapods相关总结
查看>>
[Hibernate 的left join]Path expected for join!错误
查看>>
maven入门探讨
查看>>
走一个适合自己的路-- On My Way
查看>>