私のブログhttp://www.codinglemon.cn/へようこそ。
インタビューの質問17.04。不足している番号
1.タイトルの説明
配列numsには、0からnまでのすべての整数が含まれていますが、1つが欠落しています。不足している整数を見つけるためのコードを記述してください。O(n)時間でできますか?
例1:
入力:[3,0,1]
出力:2
例2:
入力:[9,6,4,2,3,5,7,0,1]
出力:8
2.問題解決コード
2.1タイプブルートフォースクラッキング
私が考えた最初の方法は、新しいブール配列tempArrを作成することです。配列の長さは、渡されたnums配列の長さに1を加えたものです(nums配列には数値がないため)。次に、nums配列をトラバースして話します。 numsの各要素の値についてこの値は、tempArr配列の添え字として使用されます。添え字の対応する要素の値をtrueに変更します。nums配列をトラバースした後、tempArrの添え字として欠落している数値のみが存在します。対応する要素の値はfalseです。tempArrをトラバースして、欠落している要素であるfalseの値を持つ要素の添え字を見つけます。
class Solution {
public int missingNumber(int[] nums) {
int numLength = nums.length;
boolean[] tempArr = new boolean[numLength+1];
for(int i =0;i< numLength;i++){
tempArr[nums[i]] = true;
}
for(int i=0;i< tempArr.length;i++){
if(!tempArr[i]){
return i;
}
}
return -1;
}
}
このとき、実行時間と占有メモリは次のとおりです。
特にメモリ消費に関しては、あまり理想的ではありません。結局のところ、一時的な配列が作成されます。
2.2合計と減算
配列全体の要素は配列の長さに1を加えたもの以下であるため、一時変数sumを定義し、sum = sum + i-nums [i]となるようにnums配列をトラバースします。これにより、numsをトラバースした後配列の場合、sumの値は欠落している値です。コードは次のように表示されます。
class Solution {
public int missingNumber(int[] nums) {
int numLength = nums.length;
int sum = numLength;
for(int i =0;i< numLength;i++){
sum = sum + i-nums[i];
}
return sum;
}
}
実行時間とメモリ使用量は次のとおりです。
別の解決策は、まだ理解されていないビット演算を使用することです...