リコウ ブラッシングノート day7 (配列内の数字の繰り返し + 並べ替えられた配列内の数字の検索 + 0 から n-1 までの数字の欠落)

配列で繰り返される数字

トピック

ここに画像の説明を挿入

一連の考え

ハッシュ テーブルを作成し、配列をトラバースし、存在しない場合はハッシュ テーブルに追加し、存在する場合は直接返します

コード

var findRepeatNumber = function(nums) {
    
    
    let map = new Map();
    for(let i=0;i<nums.length;i++)
    {
    
    
        if(!map.has(nums[i]))
        {
    
    
            map.set(nums[i],i)
        }else{
    
    
            return nums[i]
        }
    }
    return null
};

ソートされた配列内のデータを検索

トピック

ここに画像の説明を挿入

一連の考え

targetLeft と targetRight をターゲット値の両側に等しい次のテーブルとして定義し、二分探索を使用して targetLeft と targetRight を取得し、最後に 2 つを減算して 1 を加算して結果を取得します。targetLeft を計算する手順は次のとおりです

  • 最初に targetLeft を -1 などのランダムな値として定義し、それぞれ配列の最初の要素と最後の要素を指す左右のポインターを定義します。

ここに画像の説明を挿入

  • 次に、図 2 に示すように、中間ポインター mid を計算し、nums[2]=7<target を判断します。

ここに画像の説明を挿入

  • 次に、左=中央+1にします

ここに画像の説明を挿入

  • 次に、mid=4 と nums[4]==target を計算します。

ここに画像の説明を挿入

  • ターゲット左=中

ここに画像の説明を挿入

  • 右=中-1

ここに画像の説明を挿入

  • この時点で left=right なので、ループを続けて mid=3 を計算し、nums[3]=target

ここに画像の説明を挿入

  • targetLeft=mid=3 とします。

ここに画像の説明を挿入

  • right=mid-1 とし、このとき right<left としてループから飛び出す。

ここに画像の説明を挿入
targetRight を見つける手順は同じです。

コード

var search = function (nums, target) {
    
    
    var targetLeft = -1,
        targetRight = -1,
        left=0,
        right=nums.length-1;
    //找出该数在左边第一次出现的位置
    while (left<=right) {
    
    
        var mid = Math.floor((left + right) / 2);
        if (target == nums[mid]) {
    
    
            targetLeft = mid;   //记录下第一次出现的下标
            right=mid - 1;    //继续向前查找是否该数出现过
        } else if (target < nums[mid]) {
    
    
            right = mid -1;
        } else {
    
    
            left = mid + 1;
        }
    }
    //重置 left 和 right 的值,找出该数在右边最后一个出现的位置
    left = 0;
    right = nums.length - 1;
    while (left <= right) {
    
    
        var mid = Math.floor((left + right) / 2);
        if (target == nums[mid]) {
    
    
            targetRight = mid;
            left = mid + 1;
        } else if (target < nums[mid]) {
    
    
            right = mid - 1;
        } else {
    
    
            left = mid + 1;
        }
    }
    return targetLeft<=targetRight&&targetLeft!==-1 ? targetRight - targetLeft + 1 : 0;
};

0 から n-1 までの数字の欠落

トピック

ここに画像の説明を挿入

一連の考え

数式を使用して 0 ~ n の合計を計算し、nums の合計を引いて不足している数値を取得します。

コード

var missingNumber = function(nums) {
    
    
    const n = nums.length + 1;
    let total = Math.floor(n * (n - 1) / 2);
    let arrSum = 0;
    for (let i = 0; i < n - 1; i++) {
    
    
        arrSum += nums[i];
    }
    return total - arrSum;
};

おすすめ

転載: blog.csdn.net/weixin_51610980/article/details/128408614