欠落した数値【leetCode異或解を使用してデフォルト値の問題を探す】
1059 ワード
欠落した数値
例1:
例2:
説明:あなたのアルゴリズムは線形時間の複雑さを持つべきです.追加の定数空間だけで実現できますか?
解:このような問題に対する変種も多く、例えば長さ10000の数列があり、1-10000の自然数が格納されており、連続的で重複していないが、数列は秩序正しくない現在、ランダムに1-10000の間のある自然数を選択し、この数列に加え、簡便なアルゴリズムでこの後に加えられた数を見つけることが要求されている.この問題は本題の解法と同じで,異或を用いる.
まず、異或の特徴を理解してみましょう.
1.2つの同じ数がビット別または結果的に0
2.任意の数とゼロはビット別または結果的にこの数自体である.
だから1^1=0、1^1^2=2、1^1^2^3=3があって、このように私达は0から遍歴することができて、私达は0-nを异なって、それから配列の中の値を异なっています.
0, 1, 2, ..., n
のn個の数を含むシーケンスを与え、0を見つけ出す.nにはシーケンスに現れる数はありません.例1:
: [3,0,1]
: 2
例2:
: [9,6,4,2,3,5,7,0,1]
: 8
説明:あなたのアルゴリズムは線形時間の複雑さを持つべきです.追加の定数空間だけで実現できますか?
解:このような問題に対する変種も多く、例えば長さ10000の数列があり、1-10000の自然数が格納されており、連続的で重複していないが、数列は秩序正しくない現在、ランダムに1-10000の間のある自然数を選択し、この数列に加え、簡便なアルゴリズムでこの後に加えられた数を見つけることが要求されている.この問題は本題の解法と同じで,異或を用いる.
まず、異或の特徴を理解してみましょう.
1.2つの同じ数がビット別または結果的に0
2.任意の数とゼロはビット別または結果的にこの数自体である.
だから1^1=0、1^1^2=2、1^1^2^3=3があって、このように私达は0から遍歴することができて、私达は0-nを异なって、それから配列の中の値を异なっています.
public class Test07 {
public static void main(String[] args) {
int[] a={9,6,4,2,3,5,7,0,1};
System.out.println(missingNumber(a));
}
public static int missingNumber(int[] nums) {
int n=0;
for (int i = 0; i < nums.length ; i++) {
n=n^i;
n=n^nums[i];
}
n=n^nums.length; // , 0-n , n+1
return n;
}
}