[アルゴリズム-Javaの実装]一度だけ現れる数字を見つける
1.問題の説明:
空でない整数の配列を指定すると、1回だけ表示される要素を除いて、他のすべての要素は2回表示されます。一度だけ現れる要素を探してください。
といった:
入力:[2,2,1];出力:1
入力:[1,2,2,3,4,3,4];出力:1
2.質問の回答:
アイデア:XOR演算
この質問の要素は1回と2回しか表示されないため、最適な解決策は配列要素に対してXOR演算を実行することです。
XOR演算とは何ですか?
簡単に言うと、2つの数値が異なる場合、XORの結果は1です。2つの数値が同じ場合、XORの結果は0です。XORは、1に等しくなく、0に等しくないことを意味します。
XOR演算の機能:
1.任意の数と0に対して排他的論理和演算を実行すると、結果は元の数、つまりa ^ 0 = aになります。
2.任意の数とそれ自体に対してXOR演算を実行します。結果は0、つまりa ^ a = 0です。
3.排他的論理和演算は可換法則と結合法則を満たします
まず、int型変数singleNumber = 0を定義し、次に配列をトラバースし、singleNumberでXOR演算を実行し、最後にsingleNumberを返します。
例:input [2,2,1]、singleNumberは0に初期化されます。
singleNumberは0であり、2は2を取得するためにXORされます。
singleNumberは2であり、次に2とXORして0を取得します。
singleNumberは0で、1で計算して1を取得します。
3.アルゴリズム分析:
1.時間計算量はO(N)です:配列をトラバースします
2.余分なスペースの複雑さはO(1)です。余分なスペースは使用されません。
コードは以下のように表示されます
import java.util.Scanner;
class Solution {
//测试方法
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
String[] strArray = str.split(",");
int[] nums = new int[strArray.length];
for(int i=0;i<nums.length;i++) {
nums[i]=Integer.parseInt(strArray[i]);
}
int result = singleNumber(nums);
System.out.println(result);
}
//实现方法
public static int singleNumber(int[] nums) {
int singleNumber = 0;
for (int num : nums) {
singleNumber ^= num;
}
return singleNumber;
}
}