消える数字

私のブログ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;
    }
}

このとき、実行時間と占有メモリは次のとおりです。

image.png

特にメモリ消費に関しては、あまり理想的ではありません。結局のところ、一時的な配列が作成されます。

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;
    }
}

実行時間とメモリ使用量は次のとおりです。

image.png

別の解決策は、まだ理解されていないビット演算を使用することです...

おすすめ

転載: blog.csdn.net/zry15671554200/article/details/114899955