本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目 

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

思路

  字符只能一个一个从字符流中读出来,因此要定义一个容器来保存字符以及其在字符流中的位置。

  为尽可能搞笑解决问题,要在O(1)时间内往数据容器中插入字符,及其对应的位置,因此这个数据容器可以用哈希表来实现,以字符的ASCII码作为哈希表的键值key,字符对应的位置作为哈希表的值value。

  开始时,哈希表的值都初始化为-1,当读取到某个字符时,将位置存入value中,如果之前读取过该字符(即value>=0),将value赋值为-2,代表重复出现过。最后对哈希表遍历,在value>=0的键值对中找到最小的value,该value即为第一个只出现一次的字符,ASCII码为key的字符即为所求字符。

测试算例 

  1.功能测试(读入一个字符;读入多个字符;所有字符都唯一;所有字符重复)

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

Java代码

//题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从
//字符流中只读出前两个字符"go"时,第一个只出现一次的字符是'g'。当从该字
//符流中读出前六个字符"google"时,第一个只出现一次的字符是'l'。public class FirstCharacterInStream {private int index;private int[] occurence;public FirstCharacterInStream() {  //在构造函数中初始化成员变量index=0;occurence = new int[256];for(int i=0;i<256;i++) {occurence[i]=-1;}}public void insert(char ch) {if(occurence[(int)ch]==-1) {occurence[(int)ch]=index;   //第一次出现}else if(occurence[(int)ch]>=0) {occurence[(int)ch]=-2;   //已经出现过了}index++;}public char getFirst() {int minIndex=Integer.MAX_VALUE;  //最大的integerchar ch='#';for(int i=0;i<256;i++) {if(occurence[i]>=0 && occurence[i]<minIndex) {ch = (char) i;minIndex=occurence[i];}}return ch;}
}

  

收获

  1.对于数据流、字符流等,需要定义数据容器来保存记录。

    流和串的区别:

    1)串:字符串已经保存下来了,能够读取遍历,因此在字符串中第一个只出现一次的字符中,只需要存下每个字符出现的个数,然后直接在字符串中遍历;

    2)流:字符流没有存下来,无法进行遍历,因此在本题中,只能在数据容器哈希表中遍历,而且哈希表中存放的是对应字符的位置,而不是个数。

  2.记得会用构造函数来初始化参数;

  3.Integer.MAX_VALUE=2^31-1,是32位操作系统(4字节)中最大的符号型整型常量。

  4.分清楚:字符与ASCII码的转化,以及 字符形式的数字转和整型数字间的转化

   public static void main(String[] args) {//字符转化为ASCII码char ch_a = 'a';int code_a = (int)ch_a; // =ASCII码97//ASCII码转化为字符char copyCh_a = (char) code_a;  // =ASCII码97对应的字符'a'//字符形式数字转化为整型char c1 = '2';int n1 = c1-'0';  //=2, 由'2'和'1'的ASCII码相减得到//数字转化为字符形式char copyC1 = (char)(n1+'0');  //='2' ,由'0'的ASCII码加2得到'2'的ASCII码System.out.println(5);}

  

  

更多:《剑指Offer》Java实现合集  

  

转载于:https://www.cnblogs.com/yongh/p/9954206.html

【Java】 剑指offer(50-2) 字符流中第一个只出现一次的字符相关推荐

  1. 找第一个只出现一次的字符_剑指offer 字符流中第一个只出现一次的字符

    题目描述: 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是'g'.当从该字符流中读出前六个字" ...

  2. 找出google字符流中第一个只出现一次的字符(map/queue)

    目录 解法一.hashmap 1.map的定义及插入,> 2.map的value获取及遍历 3.查找find(key) 4.计数count(key) 解法二.队列 1.队列 2.char以及op ...

  3. java统计一个字符串中每个字符出现的次数_剑指offer算法题054:字符流中第一个不重复的字符...

    推荐阅读:宇宙条的工作总结:一年前还在面试找工作,一年后在面试找工作的学弟学妹们:第一次当面试官的经历分享小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合 ...

  4. 剑指offer——python【第54题】字符流中第一个不重复的字符

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  5. [剑指offer] 字符流中第一个不重复的字符

    本文首发于我的个人博客:尾尾部落 题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是" ...

  6. 《剑指offer》字符流中第一个不重复的字符

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

  7. 剑指offer:字符流中第一个不重复的字符

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  8. 《剑指offer》-- 第一个只出现一次的字符、数组中只出现一次的数字、字符流中第一个不重复的字符、数组中重复的数字

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

  9. (剑指Offer)面试题55:字符流中第一个不重复的字符

    题目: 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前 ...

最新文章

  1. netty冲突 play sbt_netty4 实现一个断点上传大文件功能
  2. mysql---CV出现的中英文符号错误
  3. docker安装elasticsearch_Elasticsearch amp; Kibana 部署安装 (Docker)
  4. php多表条件查询,php如何实现多表查询
  5. 数据增强语义分割和作物杂草分类
  6. 拓端tecdat|使用SAS Enterprise Miner进行数据挖掘:信用评分构建评分卡模型
  7. python清除数据库表命令_数据库----Python操作数据库
  8. 南天打印机(NANTIAN PR2)配合税控机安装
  9. 中国名人书画展由世界全媒体联盟中国区及广西明星影视文化传媒有限公司联合举办
  10. Jib构建镜像问题从定位到深入分析
  11. 【深度学习】猫狗识别TensorFlow2实验报告
  12. 武汉流星汇聚:跨境电商的未来是跨境电商和区块链技术相结合
  13. AEJoy —— 彻底搞懂 AE 各种 loop* 表达式【二】
  14. linux挂载移动硬盘 格式化_Linux(CentOS)挂载NTFS格式的U盘、移动硬盘
  15. 为什么嵌入式 IoT 设备优先选择 RTOS 而不是Linux ?
  16. 2017年编程语言排行榜
  17. [STL]set存储pair并自定义排序
  18. 爬虫实战17:多线程爱丝APP图片爬虫
  19. 中国科学院大学计算机复试考什么区别,中国科学院大学考研复试流程及经验分享...
  20. wasp模型建模经验

热门文章

  1. 数据结构之图书管理系统
  2. 远程服务器返回错误 怎么解决
  3. 模拟人生Java修改_【M4秘籍】常用秘籍与修改的技巧
  4. 解决flex布局导致图片变形
  5. Displaying a List
  6. Macbook pro 2018闪屏问题
  7. SQL service 安全管理(1)登录名(创建与删除)
  8. 乐视的未来押在电视上,电视成则乐视成
  9. 【计算机考研】考研英语阅读
  10. 大考在即,互联网保险该如何突围?