题目描述
统计一个数字在升序数组中出现的次数。
代码1:自己用的HashMap方法,比较简单,但是不是面试时的方法。
(题目提到有序,一定要想到二分,二分查找的前提就是有序)
import java.util.HashMap;
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if (array.length==0||array==null)return 0;
HashMap<Integer,Integer> map=new HashMap <Integer,Integer>();
//创建HashMap,用于存储数组中的值以及出现的次数
for(int i=0;i<array.length;i++){
if(!map.keySet().contains(array[i])){
map.put(array[i],1);
}else{
map.put(array[i],map.get(array[i])+1);
//map中已经存在,键值对进行覆盖,键对应的值+1
}
}
//遍历完成
if(!map.keySet().contains(k)){
return 0; //如果键不包含K,返回0
}else{
return map.get(k);//键包含K,
}
}
}
代码2:面试官想要的代码,因为代码1没有考虑到题目中的条件,数组升序。
所以采用二分查找的思想,先在整个数组中找到array[i]等于K的值,再跟踪i这个索引分别向前和向后查找,代码如下;
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array.length==0)return 0;
int end=array.length-1;
int start=0;
int mid=(start+end)/2;
int sum=0;
while(array[mid]!=k&&start<=end){
if(array[mid]>k){
end=mid-1;
mid=(start+end)/2;
}else {
start=mid+1;
mid=(start+end)/2;
}
}
int i=mid;
int j=mid+1;
while(i>=0&&array[i]==k){
sum++;
i--;
}
while(j<=end&&array[j]==k){
sum++;
j++;
}
return sum;
}
}