题目:请实现一个函数用来找出字符流中第一个仅仅出现一次的字符。


举例说明

  比如,当从字符流中仅仅读出前两个字符“go”时。第一个仅仅出现一次的字符是‘g’。当从该字符流中读出前六个字符“google”时,第一个仅仅出现1次的字符是”l”。

解题思路

  字符仅仅能一个接着一个从字符流中读出来。能够定义一个数据容器来保存字符在字符流中的位置。当一个字符第一次从字符流中读出来时,把它在字符流中的位置保存到数据容器里。当这个字符再次从字符流中被读出来时。那么它就不是仅仅出现一次的字符。也就能够被忽略了。

这时把它在数据容器里保存的值更新成一个特殊的值(比方负值)。

  为了尽可能高校地解决问题。须要在O(1)时间内往容器里插入一个字符,以及更新一个字符相应的值。这个容器能够用哈希表来实现。用字符的ASCII码作为哈希表的键值,而把字符相应的位置作为哈希表的值。

代码实现

public class Test55 {
/**
* 题目:请实现一个函数用来找出字符流中第一个仅仅出现一次的字符。
*/
private static class CharStatistics {
// 出现一次的标识
private int index = 0;
private int[] occurrence = new int[256]; public CharStatistics() {
for (int i = 0; i < occurrence.length; i++) {
occurrence[i] = -1;
}
} private void insert(char ch) {
if (ch > 255) {
throw new IllegalArgumentException( ch + "must be a ASCII char");
} // 仅仅出现一次
if (occurrence[ch] == -1) {
occurrence[ch] = index;
} else {
// 出现了两次
occurrence[ch] = -2;
} index++;
} public char firstAppearingOnce(String data) {
if (data == null) {
throw new IllegalArgumentException(data);
} for (int i = 0; i < data.length(); i++) {
insert(data.charAt(i));
}
char ch = '\0';
// 用于记录最小的索引,相应的就是第一个不反复的数字
int minIndex = Integer.MAX_VALUE;
for (int i = 0; i < occurrence.length; i++) {
if (occurrence[i] >= 0 && occurrence[i] < minIndex) {
ch = (char) i;
minIndex = occurrence[i];
}
} return ch;
}
} public static void main(String[] args) {
System.out.println(new CharStatistics().firstAppearingOnce("")); // '\0'
System.out.println(new CharStatistics().firstAppearingOnce("g")); // 'g'
System.out.println(new CharStatistics().firstAppearingOnce("go")); // 'g'
System.out.println(new CharStatistics().firstAppearingOnce("goo")); // 'g'
System.out.println(new CharStatistics().firstAppearingOnce("goog")); // '\0'
System.out.println(new CharStatistics().firstAppearingOnce("googl")); // l
System.out.println(new CharStatistics().firstAppearingOnce("google")); // l
}
}

执行结果

【剑指Offer学习】【面试题55:字符流中第一个不反复的字符】的更多相关文章

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

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

  2. 剑指offer35题:第一个只出现一次的字符+剑指offer55题:字符流中第一个不重复的字符+剑指offer51题:数组中重复的数字

    在看剑指offer的时候,感觉这三个题目很像,都是用哈希表可以解决,所以把这三个题整理出来,以供复习. 剑指offer35题:第一个只出现一次的字符 题目描述:在字符串中找出第一个只出现一次的字符.如 ...

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

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

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

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

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

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

  6. 剑指Offer 54. 字符流中第一个不重复的字符 (其他)

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

  7. 剑指offer五十四之字符流中第一个不重复的字符

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

  8. 剑指Offer——字符流中第一个不重复的字符

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

  9. 【剑指Offer】54、字符流中第一个不重复的字符

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

随机推荐

  1. Windows如何安装自定义服务

    系统:Windows8 开发环境:Visual Studio 2012 开发平台 .Net Framework 4.5 找到系统盘的 C:\Windows\Microsoft.NET\Framewor ...

  2. Spring depends-on介绍

    <!-- redis配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.Jedis ...

  3. js显示日期时间(集锦)

    1.最简单的时钟显示 <div id="time"></div> <script> setInterval(); </script>

  4. 【转】在Tomcat配置JNDI数据源的三种方式

    在我过去工作的过程中,开发用服务器一般都是Tomcat 数据源的配置往往都是在applicationContext.xml中配置一个dataSource的bean 然后在部署时再修改JNDI配置 我猜 ...

  5. CF GYM 100703L Many questions

    题意:题意真坑……龙要问一系列问题,王子骑士公主分别以一个整数回答,如果王子和公主答案差的绝对值比骑士和公主答案差的绝对值小则说王子和公主的答案更相似,反过来如果前者比后者大则说骑士和公主的答案更相似 ...

  6. Codeforces 611D New Year and Ancient Prophecy dp+字符串比较

    这是CF Goodbye 2015 的D题,当时我想了一个n^3的dp算法,肯定不能过,然后听到学长后缀数组的n^2log(n)写法,仰慕 最后打完比赛看到了t神的n^2写法,简直膜拜,直接省去了后缀 ...

  7. jad的用法(反编译某目录下所有class)

    jad -s java -d E:\scm\MonitorServerEx\src2 -o -ff -r E:\scm\MonitorServerEx\classes-recomp\**\*.clas ...

  8. LaTex 高中数学公式

    排版数学公式是TeX系统设计的初衷,它在LaTeX中占有特殊地位,也是LaTeX最为人所称道的功能之一.基于对MathType排版效果的不满意,以及对公式进行检索的需求,我们使用LaTeX输入数学公式 ...

  9. 【转】logger

    一个使用java.util.logging.Logger进行log输出的示例代码如下: package com.sample; import java.io.File; import java.uti ...

  10. 问题-File not "controls.res"(XE2+Win7虚拟机)

    问题现象:我在Win7的虚拟机中安装XE2,前提是原来的系统上有D2007,安装后,新建个工程,F9报"File not controls.res".百思不得其解. 问题原因:因为 ...