#include<iostream>
#include<cstdio>
using namespace std;
int getleft(int a[],int n,int value)
{
//find the first one
for(int i=0;i<n;i++)
{
if(a[i] == value)
return i;
}
return -1;
}
int getright(int a[],int n,int value)
{
//find the last one
int i=0;
for(;i<n;i++)
{
if(a[i] > value)
if(i==0)
return -1;
else
return i;
}
if(i==n)
return n;
return -1;
}
int main()
{
int n,m,k;
int *a;
while(scanf("%d",&n)!=EOF)//第一行输入
{
a = new int[n];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);//第二行输入
}
scanf("%d",&m);//第三行输入
for(int i=0;i<m;i++)
{
scanf("%d",&k);//第四行输入
int r = getright(a,n,k);
int l = getleft(a,n,k);
if( (l!= -1) &&(r != -1))
printf("%d\n", r-l);
else
printf("0\n");
}
delete[] a;
a=NULL;
}
return 1;
}
1,极端情况要想清楚。都考虑到、并处理掉,才可以。
2,数组的长度受内存大小限制,太大的话就要另想算法了。
3,用二分查找更好。怎么样设计两种不同的二分查找?