统计一个数字在排序数组中出现的次数。
这个思路和做法比较简单粗暴。由于是排序数组,所以相同的数字肯定是排在一起的。所以用两个循环,一个从头找一个从尾找,找到第一次出现的位置和最后一次出现的位置。再相减即可。
function GetNumberOfK(data, k)
{
// write code here
var start = -1
var end = -1
for(var i = 0;i < data.length; i++)
{
if(data[i]==k)
{
start = i;
break
}
}
for(var j = data.length-1; j>-1; j--)
{
if(data[j]==k)
{
end = j
break
}
}
if(start != -1 && end != -1)
{
return end - start + 1;
}
else
{
return 0
}
}
看到有序数组,就要想到二分法。但是与传统的二分法不同,这里同一个值可能出现多次,而我们要找到他出现的第一次和最后一次。所以要多进行一步判断。(注释中有说明)
function GetNumberOfK(data, k)
{
// write code here
if(data.length == 0)
{
return 0;
}
var first = theFirst(data,0,data.length-1,k)
var last = theLast(data,first-1,data.length-1,k)
if(first!=-1 && last!=-1)
{
return last-first+1;
}
else
{
return 0;
}
}
//找到第一次出现K的位置
function theFirst(data,start,end,k)
{
if(start>end)
{
return -1;
}
var mid = parseInt((start+end)/2)
if(data[mid]>k)
{
end = mid - 1;
return theFirst(data,start,end,k)
}
else if(data[mid]<k)
{
start = mid + 1
return theFirst(data,start,end,k)
}
//还要多加一个判断如果mid-1也为k的话,说明第一次出现的位置还更小。
else if((mid-1>=0) && (data[mid-1]==k))
{
return theFirst(data,start,mid-1,k)
}
else
{
return mid;
}
}
//找到最后一次出现K的位置
function theLast(data,start,end,k)
{
if(start>end)
{
return -1;
}
var mid = parseInt((start+end)/2)
if(data[mid]>k)
{
end = mid - 1;
return theLast(data,start,end,k)
}
else if(data[mid]<k)
{
start = mid + 1
return theLast(data,start,end,k)
}
//还要多加一个判断如果mid+1也为k的话,说明最后一次出现的位置还更大。
else if((mid+1<data.length) && (data[mid+1]==k))
{
return theLast(data,mid+1,end,k)
}
else
{
return mid;
}
}