剑指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
都是处理字符串的。区别:
- 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:
StringBuilder > StringBuffer > String
- 在线程安全上,
StringBuilder
是线程不安全的,而StringBuffer
是线程安全的 String
:适用于少量的字符串操作的情况StringBuilder
:适用于单线程下在字符缓冲区进行大量操作的情况StringBuffer
:适用多线程下在字符缓冲区进行大量操作的情况