トピックの説明
整数配列内の 2 つの数値を除いて、他のすべての数値は 2 回現れます。一度しか出現しないこれら 2 つの数字を見つけるプログラムを作成してください。
必要な時間計算量は O(n)、空間計算量は O(1) です。
一連の考え
空間の複雑さにより、暴力 (O(n^2)) はおろか、マップを使用することもできません (O(n))。
1. ポジティブな解決策: グループ XOR。リンクは以下にあります。
大物グループが XOR を行う
次に、要件に関係なく、マッピングのみが行われます。練習しても大丈夫です。
詳細:
1. hashmap.getOrDefault(x, y)
x と y の型は自己決定されます。つまり、keySet() に x が存在する場合は対応する値が取得され、x が存在しない場合は y が取得されます。デフォルトで与えられます。
2. int[] と int が動的に作成される場合 (int[] a = new int[n])、デフォルトではすべての要素が 0 になります。文字列の場合は null の代わりに。シンプルですが、最初は見落とされます。
コード
HashMapのバージョンが正しくありません
class Solution {
public static int[] singleNumbers(int[] nums) {
int[] res = new int[2];
HashMap<Integer, Integer> hashmap = new HashMap<>();
for(int i =0; i<nums.length; i++){
hashmap.put(nums[i], hashmap.getOrDefault(nums[i],0)+1);
}
for(Map.Entry<Integer, Integer> map : hashmap.entrySet()){
if(map.getValue() == 1){
if(res[0] == 0) {
res[0] = map.getKey();
}
else if(res[1] == 0) {
res[1] = map.getKey();
}
}
}
return res;
}
}