剣指OFFER----5-3-1、数字がソート配列に出現する回数(js実現)
7233 ワード
テーマ
一つの数字を統計して並べ替え配列に出現する回数.例えば、入力配列{1,2,3,3,3,3,4,5}と数字3は、この数の中で3回現れたので、出力4.
考え方
一番簡単な方法は最初の数から探すことですが、このような方法はきっと面接を通過できません.
配列を並べ替えるなら、第一のKを見つけるために、二分割で検索します.
中間の数を探すたびに、Kより大きいなら、最初のKを探し続けます.Kより小さいなら、後半で第一のKを探し続けます.Kであれば、第一のKかどうかを判断します.第一のKであれば、カウントを始めます.そうでなければ、引き続き前半で第一のKを探します.見つけたら、数え始めます.
一つの数字を統計して並べ替え配列に出現する回数.例えば、入力配列{1,2,3,3,3,3,4,5}と数字3は、この数の中で3回現れたので、出力4.
考え方
一番簡単な方法は最初の数から探すことですが、このような方法はきっと面接を通過できません.
配列を並べ替えるなら、第一のKを見つけるために、二分割で検索します.
中間の数を探すたびに、Kより大きいなら、最初のKを探し続けます.Kより小さいなら、後半で第一のKを探し続けます.Kであれば、第一のKかどうかを判断します.第一のKであれば、カウントを始めます.そうでなければ、引き続き前半で第一のKを探します.見つけたら、数え始めます.
function GetNumberOfK(data, k)
{
// write code here
if (!data) {
return 0
}
let i = 0
let j = data.length - 1
while (i <= j) {
let mid = Math.floor((i + j) / 2)
if (data[mid] < k) {
i = mid + 1
} else if (data[mid] > k) {
j = mid - 1
} else {
if (mid === 0) {
let counts = 0
for (let i = 0; i < data.length; i++) {
if (data[i] === k) {
counts++
} else {
break
}
}
return counts
} else {
if (data[mid-1] === k) {
j = mid - 1
} else {
let counts = 0
for (let i = mid; i < data.length; i++) {
if (data[i] === k) {
counts++
} else {
break
}
}
return counts
}
}
}
}
return 0
}