記事ディレクトリ
配列で繰り返される数字
トピック
一連の考え
ハッシュ テーブルを作成し、配列をトラバースし、存在しない場合はハッシュ テーブルに追加し、存在する場合は直接返します
コード
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;
};