【剑指offer】面试题53(1):数字在排序数组中出现的次数

来源:互联网 发布:网络销售主管职责 编辑:程序博客网 时间:2024/05/20 15:41

题目

统计一个数字在排序数组中出现的次数。

思路

二分法找到该数字的第一个下标,和最后一个下标
若在数组中找到某下标对应的值为k,
 如果它的前一个数字不为k,则它就是第一个k;
 如果它的后一个数字不为k,则它就是最后一个k

代码

/** * 题目: * 统计一个数字在排序数组中出现的次数。 *  * 思路: * 二分法找到该数字的第一个下标,和最后一个下标 * 若在数组中找到某下标对应的值为k, * 如果它的前一个数字不为k,则它就是第一个k; * 如果它的后一个数字不为k,则它就是最后一个k *  * @author peige */public class _53_01_NumberOfK {    public int GetNumberOfK(int [] array , int k) {        if(array == null || array.length == 0)            return 0;        int indexOfFirstK = getFirstK(array, 0, array.length - 1, k);        int indexOfLastK = getLastK(array, 0, array.length - 1, k);        if(indexOfFirstK == -1)            return 0;        return indexOfLastK - indexOfFirstK + 1;    }    private int getFirstK(int[] array, int low, int high, int k) {        if(low > high)            return -1;        int mid = low + (high - low) / 2;        if(array[mid] > k)             return getFirstK(array, low, mid - 1, k);        else if(array[mid] < k)            return getFirstK(array, mid + 1, high, k);        else if(mid > 0 && array[mid - 1] == k)             return getFirstK(array, low, mid - 1, k);        else            return mid;    }    private int getLastK(int[] array, int low, int high, int k) {        if(low > high)            return -1;        int mid = low + (high - low) / 2;        if(array[mid] > k)             return getLastK(array, low, mid - 1, k);        else if(array[mid] < k)            return getLastK(array, mid + 1, high, k);        else if(mid < high && array[mid + 1] == k)             return getLastK(array, mid + 1, high, k);        else            return mid;    }}

测试

public class _53_01_Test {    public static void main(String[] args) {        test1();        test2();        test3();    }    private static void test1() {        int[] arr = new int[] {1,2,2,3,3,3,3,3,4,4,4,5,5,6,7,8};        _53_01_NumberOfK nok = new _53_01_NumberOfK();        int n = nok.GetNumberOfK(arr, 3);        MyTest.equal(n, 5);        n = nok.GetNumberOfK(arr, 4);        //System.out.println(n);        MyTest.equal(n, 3);        n = nok.GetNumberOfK(arr, 5);        //System.out.println(n);        MyTest.equal(n, 2);        n = nok.GetNumberOfK(arr, 6);        MyTest.equal(n, 1);        n = nok.GetNumberOfK(arr, 11);        MyTest.equal(n, 0);    }    private static void test2() {        int[] arr = new int[] {1};        _53_01_NumberOfK nok = new _53_01_NumberOfK();        int n = nok.GetNumberOfK(arr, 3);        MyTest.equal(n, 0);        n = nok.GetNumberOfK(arr, 1);        MyTest.equal(n, 1);    }    private static void test3() {        _53_01_NumberOfK nok = new _53_01_NumberOfK();        int n = nok.GetNumberOfK(new int[0], 1);        MyTest.equal(n, 0);        n = nok.GetNumberOfK(null, 1);        MyTest.equal(n, 0);    }}
阅读全文
0 0
原创粉丝点击