剑指offer——字符流中第一个不重复字符

剑指offer——字符流中第一个不重复字符

题目描述

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

输出描述:

如果当前字符流没有存在出现一次的字符,返回#字符。

解答思路:

利用数组模拟hashtable。

public class Solution {
    int[] hashtable=new int[256];
    StringBuilder s=new StringBuilder();
    //Insert one char from stringstream
    public void Insert(char ch)
    {
        s.append(ch);
        if(hashtable[ch]==0){
            hashtable[ch]=1;
        }else{
            hashtable[ch] += 1;
        }
        /*该if...else语句可以直接替换为:
        * hashtable[ch] += 1;
        */
    }
  //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
        char[] str=s.toString().toCharArray();
        //toCharArray()的用法:将字符串对象中的字符转换为一个字符数组
        for(char c:str){
            if(hashtable[c]==1){
                return c;
            }
        }
        return '#';
    }
}

知识点添加

charAt()功能类似于数组,可以把字符串看作是char类型的数组,它是把字符串拆分获取其中的某个字符;返回指定位置的字符。
charAt(i),i为int类型,i从0开始。

toCharArray()的用法:将字符串对象中的字符转换为一个字符数组

Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

String,StringBuilder以及StringBuffer都是处理字符串的。区别:

  1. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
  2. 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
  3. String:适用于少量的字符串操作的情况

     StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

     StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

猜你喜欢

转载自blog.csdn.net/yangxingpa/article/details/80725350