在排序数组中查找数字

题目一:数字在排序数组中出现的次数。
统计一个数字在排序数组中出现的次数。例如,输入排序
数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数
组中出现了4次,因此输出4。
设计一个改进的二分查找法,
分别查找数组中第一个该数字和最后一个该数字,
找到之后;利用索引计算中间该数字的个数;

package helen.c;

public class ArrayFind {
    void test(String  testName, int data[],  int k, int expected){//{3, 3, 3, 3, 4, 5};
        if(testName != null)
            System.out.printf("%s begins: ", testName);

        int result = arrayFind(data, k);
        if(result == expected)
            System.out.printf("Passed.\n");
        else
            System.out.printf("Failed.\n");
    }

    // 查找的数字出现在数组的中间
    void test1(){
        int data[] = {1, 2, 3, 3, 3, 3, 4, 5};
        test("Test1", data, 3, 4);
    }

    // 查找的数组出现在数组的开头
    void test2(){
        int data[] = {3, 3, 3, 3, 4, 5};
        test("Test2", data, 3, 4);
    }

    // 查找的数组出现在数组的结尾
    void test3(){
        int data[] = {1, 2, 3, 3, 3, 3};
        test("Test3", data, 3, 4);
    }

    // 查找的数字不存在
    void test4(){
        int data[] = {1, 3, 3, 3, 3, 4, 5};
        test("Test4", data, 2, 0);
    }

    // 查找的数字比第一个数字还小,不存在
    void test5(){
        int data[] = {1, 3, 3, 3, 3, 4, 5};
        test("Test5", data,  0, 0);
    }

    // 查找的数字比最后一个数字还大,不存在
    void test6(){
        int data[] = {1, 3, 3, 3, 3, 4, 5};
        test("Test6", data,  6, 0);
    }

    // 数组中的数字从头到尾都是查找的数字
    void test7(){
        int data[] = {3, 3, 3, 3};
        test("Test7", data,  3, 4);
    }

    // 数组中的数字从头到尾只有一个重复的数字,不是查找的数字
    void test8(){
        int data[] = {3, 3, 3, 3};
        test("Test8", data,  4, 0);
    }

    // 数组中只有一个数字,是查找的数字
    void test9(){
        int data[] = {3};
        test("Test9", data,  3, 1);
    }

    // 数组中只有一个数字,不是查找的数字
    void test10(){
        int data[] = {3};
        test("Test10", data, 4, 0);
    }

    // 鲁棒性测试,数组空指针
    void test11(){
        test("Test11", null, 0, 0);
    }

    public static void  main( String args[]) {
        new ArrayFind().test1();
        new ArrayFind().test2();
        new ArrayFind().test3();
        new ArrayFind().test4();
        new ArrayFind().test5();
        new ArrayFind().test6();
        new ArrayFind().test7();
        new ArrayFind().test8();
        new ArrayFind().test9();
        new ArrayFind().test10();


    }

    private static int arrayFind(int[] a,int target) {
        if(a==null||a.length==0){
            return 0;
        }
        int firstTarget=getFirst(a,target,0,a.length-1);
       // System.out.println(firstTarget);
        int lastTarget=getLast(a,target,0,a.length-1);
        //System.out.println(lastTarget);
        return lastTarget-firstTarget+1;
    }
   // 1,2,3,3,3,3,3,5,6,7,8
    private static int getFirst(int[] a, int target, int start, int end) {
        int mid=start+end>>1;
        if(start>end){
            return -1;
        }
        //寻找第一个3
        if(a[mid]==target){
            if(mid>=1&&a[mid-1]==target){
                return getFirst(a,target,start,mid-1);
            }else {
                return mid;
            }
        }else if(a[mid]>target){
            return getFirst(a,target,start,mid-1);
        }else {
            return getFirst(a,target,mid+1,end);
        }

    }
    private static int getLast(int[] a, int target, int start, int end) {
        // 1,2,3,3,3,3,3,5,6,7,8
        int mid=start+end>>1;
        if(start>end){
            return -2;
        }
        //寻找最后一个3
        if(a[mid]==target){
            if(midtarget){
            return getLast(a,target,start,mid-1);
        }else {
            return getLast(a,target,mid+1,end);
        }

    }
}

你可能感兴趣的:(算法)