public class 面试题38_数字在排列数组中出现的次数 {
/*
* 题目描述
统计一个数字在排序数组中出现的次数。
*/
public static void main(String[] args) {
int[] a={1,2,2,3,3,3,3,4,5};
int[] b={};
//System.out.println(getLastK(a, 2, 0, 7));
//System.out.println(getFirstK(b, 10, 0, 0));
System.out.println(getTimesInNum(b,2));
}
public static int getTimesInNum(int[] a,int k){
if(a==null||a.length==0){
return 0;
}
int count=0;
int first=getFirstK(a, k, 0, a.length-1);
int last=getLastK(a, k, 0, a.length-1);
if(first>-1&&last>-1){
count=last-first+1;
}
return count;
}
public static int getLastK(int[] a,int k,int start ,int end){
if(a==null||a.length==0||start>end){
return -1;
}
int middleIndex=(start+end)/2;
if(a[middleIndex]==k){
if(middleIndex==a.length-1||a[middleIndex+1]!=k){
return middleIndex;
}else{
start=middleIndex+1;
}
}else if(a[middleIndex]>k){
end=middleIndex-1;
}else{
start=middleIndex+1;
}
return getLastK(a, k, start, end);
}
public static int getFirstK(int[] a,int k,int start ,int end){
if(a==null||a.length==0||start>end){
return -1;
}
int middleIndex=(start+end)/2;
if(a[middleIndex]==k){
if(middleIndex==0||a[middleIndex-1]!=k){
return middleIndex;
}else{
end=middleIndex-1;
}
}else if(a[middleIndex]>k){
end=middleIndex-1;
}else{
start=middleIndex+1;
}
return getFirstK(a, k, start, end);
}
}