您的位置:首页 > 职场人生

面试题32:数字在排序数组中出现的次数

2013-07-26 20:31 330 查看


思路:利用二分查找分别求出该数字在数组中第一次最后一次出现的位置下标

代码:

#include "stdafx.h"
#include <iostream>
#include <assert.h>
using namespace std;

//找到数组中第一次出现key的元素的下标
int BinarySearchFirstKey(int nArr[], int nLength, int key)
{
assert(nArr != NULL && nLength > 0);
int nLow = 0;
int nHigh = nLength - 1;
int nMid = 0;

while (nLow <= nHigh)
{
nMid = nLow + ((nHigh - nLow) >> 1);
if (nArr[nMid] >= key)
{
nHigh = nMid - 1;
}
else
{
nLow = nMid + 1;
}
}

if (nLow >= 0 && nLow < nLength && nArr[nLow] == key)
{
return nLow;
}
else
{
return -1;
}
}

//找到数组中最后一次出现key的元素的下标
int BinarySearchLastKey(int nArr[], int nLength, int key)
{
assert(nArr != NULL && nLength > 0);
int nLow = 0;
int nHigh = nLength - 1;
int nMid = 0;

while (nLow <= nHigh)
{
nMid = nLow + ((nHigh - nLow) >> 1);
if (nArr[nMid] > key)
{
nHigh = nMid - 1;
}
else
{
nLow = nMid + 1;
}
}

if (nHigh >= 0 && nHigh < nLength && nArr[nHigh] == key)
{
return nHigh;
}
else
{
return -1;
}
}

int GetNumberOfKey(int nArr[], int nLength, int key)
{
assert(nArr != NULL && nLength > 0);
if (BinarySearchFirstKey(nArr, nLength, key) != -1)
{
return BinarySearchLastKey(nArr, nLength, key) - BinarySearchFirstKey(nArr, nLength, key) + 1;
}
else
{
return -1;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
int nArr[8] = {1,2,3,3,3,3,4,5};
int key = 0;
cin >> key;
cout << GetNumberOfKey(nArr, 8, key) << endl;
system("pause");
return 0;
}
运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: