題目:統計一個數字在排序數組中出現的次數,例如輸入排序數組{1,2,3,3,3,3,4,5}和數字3,由於3在這個數組中出現了4次,因此輸出4。
最普通的解法
思路:順序掃描,用一個計數器來記錄這個數在這個數組中出現的次數。代碼如下:
public int getNUmber(int data,int a[]){
int number=0;
if(a==null){
return -1;
}else{
for(int i=0;i<a.length;i++){
if(a[i]==data){
number++;
}
}
}
return number;
}
進階解法
思路:採用二分查找,具體思路可以查看《劍指offer》,現在我將代碼展示如下:
public int number(int data,int a[]){
return getLast(data, a)-getFirst(data, a)+1;
}
/**
* 數字在排序數組中第一次出現的索引
*/
private int getFirst(int data,int a[]){
int firstIndex=-1;
int low=0,high=a.length-1,mid=0;
while(low<=high){
mid=(low+high)/2;
if(data<a[mid]){
high=mid-1;
}else if(data>a[mid]){
low=mid+1;
}else{
if(mid>=1&&a[mid-1]==data){
high=high-1;
}else{
return mid;
}
}
}
return firstIndex;
}
/**
* 數字在排序數組中最後一次出現的索引
* @param data
* @param a
* @return
*/
private int getLast(int data,int a[]){
int LastIndex=-1;
int low=0,high=a.length-1,mid=0;
while(low<=high){
mid=(low+high)/2;
if(data<a[mid]){
high=mid-1;
}else if(data>a[mid]){
low=mid+1;
}else{
if(mid<=a.length-2&&a[mid+1]==data){
low=low+1;
}else{
return mid;
}
}
}
return LastIndex;
}
面向對象的解法
以上的代碼最主要是針對某一特定類型,不能夠很好地應用到多種數據類型,所以我採用了泛型的用法,使之能夠運用到多種數據類型,代碼如下:
package com.qiao.offer;
public class Arrays<T extends Comparable<T>> {
public int number(T data,T a[]){
if(data==null||a==null){
return -1;
}
return getLast(data, a)-getFirst(data, a)+1;
}
/**
* 數字在排序數組中第一次出現的索引
*/
private int getFirst(T data,T a[]){
int firstIndex=-1;
int low=0,high=a.length-1,mid=0;
if(data==null||a==null){
return -1;
}
while(low<=high){
mid=(low+high)/2;
if(data.compareTo(a[mid])<0){
high=mid-1;
}else if(data.compareTo(a[mid])>0){
low=mid+1;
}else{
if(mid>=1&&a[mid-1]==data){
high=high-1;
}else{
return mid;
}
}
}
return firstIndex;
}
/**
* 數字在排序數組中最後一次出現的索引
* @param data
* @param a
* @return
*/
private int getLast(T data,T a[]){
int LastIndex=-1;
int low=0,high=a.length-1,mid=0;
if(data==null||a==null){
return -1;
}
while(low<=high){
mid=(low+high)/2;
if(data.compareTo(a[mid])<0){
high=mid-1;
}else if(data.compareTo(a[mid])>0){
low=mid+1;
}else{
if(mid<=a.length-2&&a[mid+1]==data){
low=low+1;
}else{
return mid;
}
}
}
return LastIndex;
}
}
測試用例如下:
public static void main(String[] args) {
Arrays arrays=new Arrays();
//測試用例(功能測試,邊界值測試,特殊輸入測試)
/**
* 1、沒有值;
* 2、有一個值(普通值,最小值,最大值)
* 3、有多個值
*/
Integer a[]={1,2,3,3,3,3,4,5};
String b[]={"a","b","c","c","c","c","d","d"};
System.out.println(arrays.number("c", b));
}