您的位置:首页 > 职场人生

面试题38:数字在排序数组中出现的次数

2015-04-28 12:01 393 查看
题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数字中出现了4次,因此输出4。

算法思路:因为数组有序,利用二分查找的思想,先找出第一次出现的位置first,再找出最后一次出现的位置last,然后用last-first+1就是出现的次数。

#include <iostream>
using namespace std;

//查找K第一次出现的位置
int GetFirstK(int * data,int length,int k ,int start,int end)
{

if(start>end)
return -1;
int mid=(start+end)/2;

//如果中间的数等于k
if(data[mid]==k)
{
//如果mid不为0并且前面那个值不为K,或者mid是第一个数字说明K第一次出现
if((mid>0&&data[mid-1]!=k)||mid==0)
{
return mid;
}
//否则K第一次出现的位置应该在mid左边,向前查找
end=mid-1;
}
else if(data[mid]>k)
{
//如果当前值大于K,说明K在mid之前
end=mid-1;
}
else
{
start=mid+1;
}

return GetFirstK(data,length,k,start,end);
}

//查找K最后一次出现的位置
int GetLastK(int * data,int length,int k ,int start,int end)
{
if(start>end)
return -1;

int mid=(start+end)/2;

//如果中间的数等于k
if(data[mid]==k)
{
//如果mid不为0并且后面那个值不为K,或者mid是最后一个数字说明K最后一次出现
if((mid<end&&data[mid+1]!=k)||mid==end)
{
return mid;
}
//否则K最后一次出现的位置应该在mid右边,向前查找
start=mid+1;
}
else if(data[mid]>k)
{
//如果当前值大于K,说明K在mid之前
end=mid-1;
}
else
{
start=mid+1;
}

return GetLastK(data,length,k,start,end);
}

int GetNumberOfK(int * data,int length,int k)
{
int number=0;
if(data!=NULL||length>0)
{
int first=GetFirstK(data,length,k,0,length-1);
int last=GetLastK(data,length,k,0,length-1);
if(first>-1&&last>-1)
{
number=last-first+1;
}
}
return number;
}
int main()
{
int data[]={1,2,3,3,3,3,4,5};
cout<<GetNumberOfK(data,8,3)<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: