-
题目描述:
- 统计一个数字在排序数组中出现的次数。
-
输入:
-
每个测试案例包括两行:
第一行有1个整数n,表示数组的大小。1<=n <= 10^6。
第二行有n个整数,表示数组元素,每个元素均为int。
第三行有1个整数m,表示接下来有m次查询。1<=m<=10^3。
下面有m行,每行有一个整数k,表示要查询的数。
-
输出:
-
对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数。
-
样例输入:
-
81 2 3 3 3 3 4 513
-
样例输出:
-
4
-
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int FindFirstKey(int array[],int len,int key,int low,int high) { if(low > high) return -1; int middle = (low + high)/2; int middlevalue = array[middle]; if(middlevalue == key) { if((middle > 0 && middlevalue != array[middle - 1]) || (middle == 0)) return middle; else high = middle - 1; } else if(middlevalue > key) high = middle - 1; else low = middle + 1; return FindFirstKey(array,len,key,low,high); } int FindLastKey(int array[],int len,int key,int low,int high) { if(low > high) return -1; int middle = (low + high)/2; int middlevalue = array[middle]; if(middlevalue == key) { if((middle < len -1 && middlevalue != array[middle + 1]) || (middle == len -1)) return middle; else low = low + 1; } else if(middlevalue > key) high = middle - 1; else low = middle + 1; return FindLastKey(array,len,key,low,high); } int main(int argc,char* argv[]) { int len,times,key; int RangeIndex = 0; while(scanf("%d",&len) != EOF) { int* array = new int[len]; for(int i = 0;i < len; ++i) { scanf("%d",&array[i]); } scanf("%d",×); for(int i = 0;i < times; i++) { scanf("%d",&key); int FirstKey = FindFirstKey(array,len,key,0,len-1); int LastKey = FindLastKey(array,len,key,0,len-1); RangeIndex = LastKey - FirstKey + 1; if(FirstKey == -1 || LastKey == -1) cout<<0<<endl; else cout<<RangeIndex<<endl; } delete[] array; } return 0; }