/*
* 请实现一个函数用来找出字符流中第一个只出现一次的字符。
* 例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。
* 当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
* 如果当前字符流没有存在出现一次的字符,返回#字符。
*/
import java.util.*;
public class FirstAppearingOnce {
//Insert one char from stringstream
StringBuffer sb = new StringBuffer();
public void insert(char ch) {
sb.append(ch);
//System.out.println(sb);
}
//return the first appearence once char in current stringstream
//暴力搜索,算法复杂度:O(n^2)
public char firstAppearingOnce() {
if(sb.length() == 1) return sb.charAt(0);
List<String> list = new ArrayList<String>();
char c = 0;
for(int i = 0;i < sb.length();i ++) {
if(!list.contains(sb.charAt(i) + "")) {
int count = 0;
list.add(sb.charAt(i) + ""); //存放非重复字符列表
for(int j = i;j < sb.length();j ++) {
if(sb.charAt(j) == sb.charAt(i)) {
count ++;
}
}
if(count == 1) {
c = sb.charAt(i);
break;
}
}
}
if(c == 0) return '#';
return c;
}
//一个字符占8位,每一个字符对应一个数值,数值范围是0-255,最多不超过256种(实际上是一个哈希表)
StringBuffer sb2 = new StringBuffer();
int[] charArray = new int[256];
public void insert2(char ch) {
sb.append(ch);
charArray[ch] ++;
}
//算法复杂度:O(n)
public char firstAppearingOnce2() {
char c = 0;
for(int i = 0;i < sb.length();i ++) {
if(charArray[sb.charAt(i)] == 1) {
return sb.charAt(i);
}
}
return '#';
}
public static void main(String[] args) {
FirstAppearingOnce t = new FirstAppearingOnce();
t.insert('g');
t.insert('o');
t.insert('o');
t.insert('g');
//t.Insert('l');
System.out.println(t.firstAppearingOnce());
}
}
《剑指offer》-找出字符流中第一个只出现一次的字符
猜你喜欢
转载自blog.csdn.net/zhou15755387780/article/details/79352477
今日推荐
周排行