タイトルの説明(ポータル)
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つの文字列として説明しますsとt小文字は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演算には可換法則があります
アイデア:sとt2つの文字列が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()メソッドを提供します。