剣はオファーを指します—50。一度だけ現れる最初の文字—分析とコード(Java)

剣はオファーを指します-50。一度だけ現れる最初の文字-分析とコード[Java]

1.タイトル

文字列に1回だけ出現する最初の文字(0 <=文字列の長さ<= 10000、すべて文字で構成)を見つけ、その位置を返します。そうでない場合は、-1(大文字と小文字を区別)を返します。

2、分析とコード

1.ハッシュテーブル

(1)考える

この質問の直感的なアイデアは、文字列をトラバースするプロセスで、文字がO(1)時間計算量内に出現して記録されたかどうかが判断されるため、全体的な複雑さはO(n)で制御されるということです。
このアイデアはハッシュテーブルと組み合わせて実現でき、最適化できるポイントは2つあります
。1)文字数に制限があり、ASCIIコードと組み合わせて直接連続数に変換できるため、ハッシュテーブル配列関数で実現できます
。2)ハッシュテーブルに表示される文字数を記録する場合は、文字の位置を再度トラバースする必要があるため、文字の位置を直接記録し、繰り返し文字を記録することができます。たとえば、出現した文字の位置を-1と記録し、繰り返し出現した位置を-2と記録し、最初の出現位置を記録することで、必要な回答を得ることができます。 1回のトラバース中に。

(2)コード

public class Solution {
    
    
    public int FirstNotRepeatingChar(String str) {
    
    
        if (str.length() == 0)
            return -1;
        int[] chars = new int[58];
        for (int i = 0; i < 58; i++)
            chars[i] = -1;
        
        int base = (int)'A';
        for (int i = 0; i < str.length(); i++) {
    
    
            int index = (int)str.charAt(i) - base;
            if (chars[index] == -1)
                chars[index] = i;
            else if (chars[index] > -1)
                chars[index] = -2;
        }
        
        int ans = -1;
        for (int i = 0; i < 58; i++)
            if (chars[i] > -1 && (ans == -1 || chars[i] < ans))
                ans = chars[i];
        
        return ans;
    }
}

(3)結果

実行時間:28ms、占有メモリ:9468k。

3、その他

何もありません。

おすすめ

転載: blog.csdn.net/zml66666/article/details/109267007