[今日の1つの質問]強制ボタン389。違いを見つける

タイトルの説明(ポータル

2つの文字列sとtが与えられた場合、それらには小文字のみが含まれます。

文字列tは文字列sによってランダムに再配置され、文字がランダムな位置に追加されます。

tに追加された文字を見つけてください。

例1:

输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。

例2:

输入:s = "", t = "y"
输出:"y"

例3:

输入:s = "a", t = "aa"
输出:"a"

例4:

输入:s = "ae", t = "aea"
输出:"a"

解決策1:ACSIIコード値を減算する

アイデア:タイトルを2つの文字列として説明しますst小文字は1つしかないため、2つの文字列のACSIIコード値の違いは、同じではない文字のACSIIコードであるため、減算を行うことができます。ここでは、減算を行うためにすべてを合計するわけではありませんが、常に減算==(tsである必要があります)== ansに累積され、最後にansとt文字列の最後の文字に対応します。

public char findTheDifference(String s, String t) {
    
    
        int ans = 0;
        for (int i = 0; i < s.length(); i++) {
    
    
            ans += t.charAt(i)-s.charAt(i);
        }
       ans +=t.charAt(t.length()-1);
        return (char)(ans);
    }

解決策2:ビット演算

まず、XOR演算を見てみましょう。

  • a ^ a = 0;任意の数とそれ自体の排他的論理和は0です
  • a ^ 0 = a;任意の数と0XORはまだ彼自身のものです
  • a ^ b ^ a = a ^ a ^ b = bXOR演算には可換法則があります

アイデア:st2つの文字列が1つにマージされるため、合計で奇数の文字が作成され、1つの文字のみが奇数になるため、すべての文字をXORし、残りが探している答えになります。

public char findTheDifference(String s, String t) {
    
    
        char ans =0;
        for (int i = 0; i <s.length() ; i++) {
    
    
            ans ^= ((s.charAt(i))^(t.charAt(i)));
        }
        return (char)(ans^t.charAt(t.length()-1));
    }

解決策3:Javaのストリーム操作を使用する

関連するreduce操作リファレンス:Xiaobaiのreduceはストリームを学習します

  • 一緒に最初の文字列
  • 文字列はchars演算子を介してIntStreamに変換されます
  • reduce、XORすべての値を使用します。最終的にchar型に変換されます。

3.1

class Solution {
    
    
    public char findTheDifference(String s, String t) {
    
    
        return (char)(s + t).chars().reduce(0, (a, b) -> a ^ b);
    }
}

3.2

class Solution {
    
    
    public char findTheDifference(String s, String t) {
    
    
         return (char)((s+t).chars().reduce((a, b) -> a ^ b).getAsInt());
    }
}

解決策4:HashMap

アイデア:ハッシュテーブルを使用して操作を実行し、最初の文字列マークに表示される文字数をトラバースしてから、2番目の文字列マークをトラバースして、0になるか元のハッシュテーブルが存在しなくなるまで、出現回数を減算します。存在しないそれは戻り値が彼であることを意味します。

public char findTheDifference11(String s, String t) {
    
    
        Map<Character,Integer> hashMap = new HashMap();
        for (int i = 0; i <s.length() ; i++) {
    
    
            hashMap.put(s.charAt(i),hashMap.getOrDefault(s.charAt(i),0)+1);
        }
        for (int i = 0; i <t.length() ; i++) {
    
    
            hashMap.put(t.charAt(i),hashMap.getOrDefault(t.charAt(i),0)-1);
            if(hashMap.get(t.charAt(i)) < 0) {
    
    
                return t.charAt(i);
            }

        }
        return ' ';

    }

注:JavaのMapは、存在しないキー値のデフォルト値を提供するgetOrDefault()メソッドを提供します。

おすすめ

転載: blog.csdn.net/weixin_45532227/article/details/111370572