劍指offer題目——數字在排序數組中出現的次數

題目:統計一個數字在排序數組中出現的次數,例如輸入排序數組{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));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章