この質問については、アイデアはありません。答えのアイデアを直接見てください。答えのアイデアは
2つの同じ数値のXORは0であるため、すべての数値のXORは2つの異なる数値のXORです。その中で、XOR値の最初のビットは1であり、これを表します。
したがって、このビットが1か0かに応じて、配列を除算し、2つの配列を除算すると、2つの配列に1つの数値のみが表示され、すべての数値に対して排他的論理和演算を実行して2つの数値を見つけます。
知識のポイント:
ビット単位および、ビットシフト左
int div = 1;
while((div&res)==0){
div<<=1;
}
XOR
a ^ b
ビット単位のAND、1は左にシフトされ、0であるかどうかは判断できますが、1であるかどうかは判断できません。同時に、1が必ずしも最下位ビットにあるとは限らないためです。
回答コード
public int[] singleNumbers(int[] nums) {
int res = 0;
for(int count = 0;count<nums.length;count++){
res ^= nums[count];
}
int div = 1;
while((div& res) == 0){
div<<=1;
}
int a = 0;
int b = 0;
for(int count = 0;count<nums.length;count++){
if((nums[count]&div) == 0){
a ^= nums[count];
}else{
b ^= nums[count];
}
}
return new int[]{a,b};
}