数字在排序数组中出现的次数

题目描述:

统计一个数字在排序数组中出现的次数。

poj 网址:http://ac.jobdu.com/problem.php?pid=1349

可以AC的代码,看主要函数就行了,该poj系统的输入输出做的太烂,我用cin不支持,老报超时的错误

int findFirstPos(int *arr,int target,int start,int end, int len)
{
    while(start<end)
    {
        int mid=(end-start)/2+start;
        if(arr[mid]==target)
        {
            if(mid==0 || (mid>0 && arr[mid-1]!=target))
            {
                return mid;
            }else
            {
                end=mid-1;
            }
        }else if(arr[mid]>target)
        {
            end=mid-1;
        }else
        {
            start=mid+1;
        }
    }
    if(arr[start]==target)
    {
        return start;
    }else
    {
        return -1;
    }

}
int findLastPos(int *arr, int target,int start, int end,int len)
{
    while(start<end)
    {
        int mid=(end-start)/2+start;
        if(arr[mid]==target)
        {
            if(mid==len-1 || (mid<len-1 && arr[mid+1]!=target))
            {
                return mid;
            }else
            {
                start=mid+1;
            }
        }else if(arr[mid]>target)
        {
            end=mid-1;
        }else
        {
            start=mid+1;
        }
    }
    if(arr[start]==target)
    {
        return start;
    }else
    {
        return -1;
    }
}
int timesForSequence(int *arr,int target,int start,int end,int len)
{
    int firstPos=findFirstPos(arr,target,start,end,len);
    int lastPos=findLastPos(arr,target, start, end,len);
    if(firstPos!=-1 && lastPos!=-1)
    {
        return lastPos-firstPos+1;
    }
    return 0;
}

int n,m,k,a[1000000];
inline void read(int &data) 
{ 
	char ch = getchar(); 
while (ch < '0' || ch > '9') 
	ch = getchar(); 
     data = 0; 
do{  
	data = data*10 + ch-'0'; 
	ch = getchar(); 
}while (ch >= '0' && ch <= '9');
} 
int main(int argc, const char * argv[])
{
	while(scanf("%d",&n)!=EOF)    
	{
		for(int i=0;i<n;i++)
		{
			read(a[i]);  
		}
		read(m);       
		for(int j=0;j<m;j++)
		{
			read(k);            
			cout<<timesForSequence(a,k,0,n-1,n)<<endl;
		}
	}

	return 0;
}


原文地址:https://www.cnblogs.com/riskyer/p/3228865.html