剣とは、オファーシリーズの「キャラクターストリームの最初の繰り返されないキャラクター」を指します

文字ストリームに1回だけ現れる最初の文字を見つける関数を実装してください。たとえば、最初の2文字「go」が文字ストリームから読み取り専用である場合、1回だけ表示される最初の文字は「g」です。文字ストリームから最初の6文字「google」を読み取る場合、1回だけ表示される最初の文字は「l」です。

現在の文字ストリームに1回出現する文字がない場合は、#文字が返されます。

アイデア
1つの配列のみを使用して、配列に複数回出現するかどうかを判断できるだけでなく、一度出現したときに、配列は文字ストリーム内の文字の位置と配列インデックスを格納します。文字のASCIIコードに対応します。ASCIIコードは128文字なので、配列のサイズで128十分です。
  配列の初期値に-1を割り当てます。文字が初めて表示されるときは、文字ストリーム内の現在の文字のインデックス(位置)に-1を更新します。2回目に表示されると、以前に割り当てられたインデックスが上書きされ、その後の判断を入力する必要はありません。ここでは、割り当ては-2)として選択されます。也就是说,没出现过,数组记录-1,出现一次,数组记录位置,出现多次,数组记录成-2
  FirstAppearingOnceメソッドでは、正しい解を見つけるために配列をトラバースする必要があるため、次の2つのことを行う必要があります。

  1. 初めて出現する文字を返す必要があるため、一度出現するすべての文字を検索します。
  2. 文字ストリームに1回出現する各文字の位置を比較し、最初に出現する文字、つまり位置が最も小さい文字を見つけます。そのため、キャラクターの位置を記録する変数も設定する必要があります。次に出現するキャラクターを見つけたら、一度だけ出現する2つのキャラクターの位置を比較し、どちらが進んでいるかを確認します。

要約すると、このメソッドは配列のみを使用して、文字が1回出現するかどうか、および1回出現するときの文字ストリーム内の位置を記録します。

import java.util.*;

public class Solution {
    
    
    
    private int index = 0;
    private static int[] arr = new int[128];
    static{
    
    
        Arrays.fill(arr,-1);
    }
    //Insert one char from stringStream
    public void Insert(char ch){
    
    
        if(arr[ch] == -1){
    
    
            arr[ch] = index;
        }else if(arr[ch]>=0){
    
    
            arr[ch] = -2;
        }
        index++;
        
    }
    //return the first appearance once char in current stringStream
    public char FirstAppearingOnce(){
    
    
        int minIndex = Integer.MAX_VALUE;
        char res = '#';
        for(int i=0; i<128; i++){
    
    
            if(arr[i]>=0 && arr[i] < minIndex){
    
    
                res = (char)i;
                minIndex = arr[i];
                
            }
        }
        return res;
    }
}

時間計算量:O(N)
空間計算量:O(N)

おすすめ

転載: blog.csdn.net/weixin_44471490/article/details/108957215