您的位置:首页 > 其它

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

2015-10-07 19:19 253 查看
题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{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指针)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分查找 数组