제목 설명
문자 만 표시 처음 문자 스트림을 찾을 수있는 기능을 구현하십시오. 예를 들어, 문자 스트림은 처음 두 문자를 읽을 때 첫 번째 문자는 한 번만 "g"를 발생, "이동". 처음 6 개 문자를 읽을 때 처음으로 하나의 문자 "L"을 표시, 문자 스트림에서 "구글".
아이디어 분석
하거나지도에 저장된 데이터는, 해시 테이블은 어레이 발생을 달성한다. 발생 자 요소 [I]와 I 값에 대응하는 ASCII 코드의 배열. 맨 처음에는, 어레이의 모든 요소는 -1로 초기화된다. 문자 나, 발생으로부터 판독하는 제 문자 스트림은 [I]는 문자 스트림에서의 위치의 값으로 갱신된다 ASCII 코드. 이 문자는 문자 스트림으로부터 다시 판독되면 -2의 값을 업데이트하기 위해 발생 [J] (발생 [I] 0보다 크거나 같다). 우리가 지금까지 반복하지 않는다 첫 번째 문자의 문자 스트림에서 읽은 모든 문자를 찾을해야하는 경우에만 전체 배열을 스캔하고 해당 문자의 0으로 작은 값보다 크거나 같은 찾아야합니다. 이 기능 FirstAppearingOnce 기능입니다.
테스트 케이스
- 기능 테스트는 : 문자는 읽기, 더 많은 문자를 읽고, 모든 문자는 고유 읽고, 모든 문자가 반복되는 읽기.
- 특별 입력 테스트 : 0 문자를 읽어 보시기 바랍니다.
자바 코드
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() {
}
}