数字在排序数组中出现的次数

来源:互联网 发布:数据库基础面试题 编辑:程序博客网 时间:2024/05/01 15:29

题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。

方法:用二分查找法找到数组第一个和最后一个k

int GetFirstK(int* data, int length, int k, int start, int end){    if (start > end){        return -1;    }    int middleIndex = (start + end) / 2;    int middleData = data[middleIndex];    if (middleData == k){        if ((middleIndex > 0 && data[middleIndex - 1] != k) || middleIndex == 0){            return middleIndex;        }        else {            end = middleIndex - 1;        }    }    else if (middleData > k){        end = middleIndex - 1;    }    else {        start = middleIndex + 1;    }    return GetFirstK(data, length, k, start, end);}int GetLastK(int* data, int length, int k, int start, int end){    if (start > end){        return -1;    }    int middleIndex = (start + end) / 2;    int middleData = data[middleIndex];    if (middleData == k){        if ((middleIndex < length - 1 && data[middleIndex + 1] != k) || middleIndex == length - 1){            return middleIndex;        }        else {            start = middleIndex + 1;        }    }    else if (middleData < k){        start = middleIndex + 1;    }    else {        end = middleIndex - 1;    }    return GetLastK(data, length, k, start, end);}int GetNumberOfK(int* data, int length, int k){    int number = 0;    if (data != NULL && length > 0){        int first = GetFirstK(data, length, k, 0, length - 1);        int last = GetLastK(data, length, k, 0, length - 1);        if (first > -1 && last > -1){            number = last - first + 1;        }    }    return number;}

测试用例

  • 功能测试(数组中包含查找的数字,数组中没有查找的数字,查找的数字在数组中出现一次/多次)
  • 边界值测试(查找数组中的最大值、最小值,数组中只有一个数字)
  • 特殊输入测试(表示数组的指针为NULL指针)
0 0