[ソートされた配列において生じるデジタル数] [オファー] [53-1]

タイトル説明

  回数にソート配列に表示される数をカウントします。図3は、アレイ内の4回、出力4を発生するため、例えば、入力配列は、{1,2,3,3,3,3,4,5}ソート、及び数3です。

牛が質問がネットワークに対処はねのけます

アイデア解析

  最初のk個の位置を見つけるために二分探索法を用いて、最後のkが表示され、数kの統計は、K中間サイズの中間の値と比較発生する可能性があります。

  1. kが半ば未満の場合、最初のkは、前半部分に表示されます。
  2. kが半ばよりも大きい場合、その後、最初のkが、後半に表示されます。
  3. それらが等しい場合は、kは、中間値または前回値K場合、kは最初の前半部に表示される最初の中間値か否かを判定する。

テストケース

  1. 機能テスト:配列を検索したい数字が含まれている、数字の配列を見つけることを望んでいない。digital'reを探しては、アレイに一回/複数回表示されます。
  2. 境界値試験:配列の最大値を検索し、最小値、アレイ内の唯一の数。
  3. 特別な入力テスト:ポインタのアレイはnullptrポインタが表されています。

Javaコード

public class Offer053_01 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();

    }

    public static int GetNumberOfK(int[] array, int k) {
        return Solution1(array, k);
    }

    private static int Solution1(int[] array, int k) {
        if (array == null || array.length <= 0) {
            return 0;
        }
        int firstK = getFirstK(array, 0, array.length - 1, k);
        if (firstK == -1) {
            return 0;
        }
        int lastK = getLastK(array, 0, array.length - 1, k);

        return lastK - firstK + 1;
        
    }
    
    private static int getFirstK(int[] array,int start,int end,int k) {
        if(start>end) {
            return -1;
        }
        int mid = (start+end)>>1;
        if(array[mid]==k) {
            if(mid==0 || array[mid-1]!=k) {
                return mid;
            }else {
                end = mid-1;
            }
        }else if(array[mid]<k) {
            start = mid+1;
        }else {
            end = mid-1;
        }
        return getFirstK(array, start, end, k);
    }
    
    private static int getLastK(int[] array,int start,int end,int k) {
        if(start>end) {
            return -1;
        }
        int mid = (start+end)>>1;
        if(array[mid]==k) {
            if(mid==array.length-1 || array[mid+1]!=k) {
                return mid;
            }else {
                start = mid+1;
            }
            
        }else if(array[mid]<k) {
            start = mid+1;
        }else {
            end = mid-1;
        }
        return getLastK(array, start, end, k);
    }

    private static void test1() {

    }

    private static void test2() {

    }

    private static void test3() {

    }

}

コードリンク

安全コードを証明するためにオファー-Java

おすすめ

転載: www.cnblogs.com/haoworld/p/offer531-shu-zi-zai-pai-xu-shu-zu-zhong-chu-xian-d.html