统计一个数字在排序数组中出现的次数。
思路1:遍历数组
function GetNumberOfK(data, k){// write code herelet count = 0data.forEach(item=>{if(item===k) count++})return count}module.exports = {GetNumberOfK : GetNumberOfK};
思路2:因为数组有序,可以用二分查找。找到最左边出现的下标,找到最右边出现的下标,两者相减
function GetNumberOfK(data, k){var number = 0;if(data.length > 0){var first = GetFirstK(data,k,0,data.length - 1),last = GetLastK(data,k,0,data.length - 1);if(first > -1 && last > -1){number = last - first + 1;}}return number;// write code here}function GetFirstK(data,k,start,end){if(start > end){return -1;}var midIndex = Math.floor((start + end) / 2);if(data[midIndex] == k){if((midIndex > 0 && data[midIndex - 1] != k) || midIndex == 0){return midIndex;}else{end = midIndex - 1;}}else if(data[midIndex] > k){end = midIndex - 1;}else{start = midIndex + 1;}return GetFirstK(data,k,start,end);}function GetLastK(data,k,start,end){if(start > end){return -1;}var midIndex = Math.floor((start + end) / 2);if(data[midIndex] == k){if((midIndex < data.length - 1 && data[midIndex + 1] != k) || midIndex == data.length - 1){return midIndex;}else{start = midIndex + 1;}}else if(data[midIndex] < k){start = midIndex + 1;}else{end = midIndex - 1;}return GetLastK(data,k,start,end);}