题目描述

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

牛客网刷题地址

思路分析

  还是将数据存放在Map中,哈希表用数组occurrence实现。数组中的元素occurrence[i]和ASCII码的值为i的字符相对应。最开始的时候,数组中的所有元素都初始化为-1。当一个ASCII码为i的字符第一次从字符流中读出时,occurrence[i]的值 更新为它在字符流中的位置。当这个字符再次从字符流中读出时(occurrence[i]大 于或者等于0),occurrence[j]的值 更新为-2。当我们需要找出到目前为止从字符流里读出的所有字符中第一个不重复的字符时,只需要扫描整个数组,并从中找出最小的大于等于0的值对应的字符即可。这就是函数FirstAppearingOnce的功能。

测试用例

  1. 功能测试:读入一个字符;读入多个字符;读入的所有字符都是唯一的;读入的所有字符都是重复出现的。
  2. 特殊输入测试:读入0个字符。

Java代码

public class Offer050_02 {
public static void main(String[] args) {
test1();
test2();
test3(); } private int index;
private int[] occurence; public Offer050_02() {
index=0;
occurence = new int[256];
for(int i=0;i<256;i++) {
occurence[i]=-1;
}
} // Insert one char from stringstream
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++;
} // return the first appearence once char in current stringstream
public char FirstAppearingOnce() {
int minIndex=Integer.MAX_VALUE; //最大的integer
char ch='#';
for(int i=0;i<256;i++) {
if(occurence[i]>=0 && occurence[i]<minIndex) {
ch = (char) i;
minIndex=occurence[i];
}
}
return ch;
} private static void test1() {
}
private static void test2() {
}
private static void test3() {
}
}

代码链接

剑指Offer代码-Java

【Offer】[50-2] 【字符流中第一个只出现一次的字符】的更多相关文章

  1. 【Java】 剑指offer(50-2) 字符流中第一个只出现一次的字符

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字 ...

  2. 《剑指offer》第五十题(字符流中第一个只出现一次的字符)

    // 面试题50(二):字符流中第一个只出现一次的字符 // 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从 // 字符流中只读出前两个字符"go"时,第一 ...

  3. 剑指offer——53字符流中第一个只出现一次的字符

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

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

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  5. 剑指offer系列28--字符流中第一个不重复的字符

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

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

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

  7. Go语言实现:【剑指offer】字符流中第一个不重复的字符

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是 ...

  8. 【剑指Offer】字符流中第一个不重复的字符 解题报告(Python)

    [剑指Offer]字符流中第一个不重复的字符 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interv ...

  9. 剑指offer(54)字符流中第一个不重复的数字

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

随机推荐

  1. Tomcat 单(多)实例部署使用

    一.前言 (一).概述 Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控 ...

  2. 堆排序(实现c++)

    堆可以看作是一个完全二叉树,分为大顶堆和小顶堆,本文我们以大顶堆为例来实现堆排序. (1)建堆 先把给定的序列转换成一棵完全二叉树,然后逐步对其调整使其每个结点的值都大于其两个子结点的值,因此我们需要 ...

  3. C#使用WebClient调用接口

    用于上传图片base64位 private void upLoadCunzai() { errorstring += " upLoadCunzai方法执行成功:用于上传已经存在人员摄像头照片 ...

  4. Java——异常处理

    1.java提供的异常不可能预见所有的问题,所以需要自己定义异常类,必须从已有的异常类继承,最好选择意思相近的异常类继承. class MyException extends Exception{} ...

  5. Mysql5.6对时间的处理精度问题

    在业务处理需要使用new Date()来更新时间类型的字段时,数据库会对时间类型进行四舍五入处理,如果new Date()的更新时间与原时间间隔太短,数据库进行四舍五入之后,认为值没有变化,从而不更新 ...

  6. Feign详细构建过程及自定义扩展

    探究清楚 feign 的原理,自定义 feign 功能 **spring-cloud-openfeign-core-2.1.1.RELEASE.jar** 中 **HystrixFeign** 的详细 ...

  7. JAVA开发奇淫巧技(一)

    本章节持续收录常用且好用的IDE开发工具,基于myeclipse 1.Lombok是一种Java实用工具,可以帮助开发人员消除Java的冗长,具体看lombok的官网:http://projectlo ...

  8. 快应用list组件 scrollTo 方法的调用方式

    例如,滚动到list 的第4个list-item: this.$element('alist').scrollTo({index:3})

  9. android下JNI开发

    android下JNI开发 what 什么是JNI JNI java native interface native本地 java本地接口 通过JNI可以实现java和本地代码之间相互调用 jni可以 ...

  10. nsq源码分析

    nsq的源码比较简单,值得一读,特别是golang开发人员,下面重点介绍nsqd,看完这篇文章希望你能对消息队列的原理和实现有一定的了解. nsqd是一个守护进程,负责接收,排队,投递消息给客户端,并 ...