[행사는] [50-2] [문자 스트림은 첫 번째 문자에 한 번 나타납니다]

제목 설명

  문자 만 표시 처음 문자 스트림을 찾을 수있는 기능을 구현하십시오. 예를 들어, 문자 스트림은 처음 두 문자를 읽을 때 첫 번째 문자는 한 번만 "g"를 발생, "이동". 처음 6 개 문자를 읽을 때 처음으로 하나의 문자 "L"을 표시, 문자 스트림에서 "구글".
  

소가 질문에 대한 네트워크를 해결 털어

아이디어 분석

  하거나지도에 저장된 데이터는, 해시 테이블은 어레이 발생을 달성한다. 발생 자 요소 [I]와 I 값에 대응하는 ASCII 코드의 배열. 맨 처음에는, 어레이의 모든 요소는 -1로 초기화된다. 문자 나, 발생으로부터 판독하는 제 문자 스트림은 [I]는 문자 스트림에서의 위치의 값으로 갱신된다 ASCII 코드. 이 문자는 문자 스트림으로부터 다시 판독되면 -2의 값을 업데이트하기 위해 발생 [J] (발생 [I] 0보다 크거나 같다). 우리가 지금까지 반복하지 않는다 첫 번째 문자의 문자 스트림에서 읽은 모든 문자를 찾을해야하는 경우에만 전체 배열을 스캔하고 해당 문자의 0으로 작은 값보다 크거나 같은 찾아야합니다. 이 기능 FirstAppearingOnce 기능입니다.

테스트 케이스

  1. 기능 테스트는 : 문자는 읽기, 더 많은 문자를 읽고, 모든 문자는 고유 읽고, 모든 문자가 반복되는 읽기.
  2. 특별 입력 테스트 : 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() {
    }
}

코드 링크

안전 코드를 증명하는 행사는 -Java

추천

출처www.cnblogs.com/haoworld/p/offer502-zi-fu-liu-zhong-di-yi-ge-zhi-chu-xian-yi-.html