基于Visual C++2013拆解世界五百强面试题--题11-查找数字出现次数

在排序数组中,找出给定数字出现的次数比如{ 1, 2, 2, 2, 3}中2的出现次数是3次


我们可使用二分查找发,分别查找出2最先出现的位置和最后出现的位置相减即可。


下面是上代码:


#include <stdio.h> 

//二分法获取元素最后出现的位置,可能在元素的下一位
int GetHigh(int array[], int size, int key)
{
	int low = 0, high = size - 1;
	while (low < high)
	{
		int mid = (low + high) / 2;
		if (array[mid] <= key)
		{
			low = mid+1;
		}
		else
		{
			high = mid;
		}
	}
	return low;
}

//二分法获取元素最先出现的位置,可能在元素的前一位
int GetLow(int array[], int size, int key)
{
	int low = 0, high = size - 1;
	while (low < high)
	{
		int mid = (low + high + 1) / 2;
		if (array[mid] >= key)
		{
			high = mid-1;
		}
		else
		{
			low = mid;
		}
	}
	return high;
}

//计算key出现总次数
int GetCount(int array[], int size, int key)
{
	int high = GetHigh(array, size, key);
	int low = GetLow(array, size, key);
	int count  = high - low + 1;
	if (array[high] != key)
		count--;
	if (array[low] != key)
		count--;

	return count;
}


int arr[] = { 1, 2, 2, 2, 3};

int main()
{
	//打印出2在数组中出现的次数
	printf("出现次数:%d  \n", GetCount(arr, 5, 2));
	return 0;
}

运行效果如图:



如果有什么问题和疑问可以在下面留言互相探讨。

原题我已经上传到这里了http://download.csdn.net/detail/yincheng01/6461073 ,

解压密码为 c.itcast.cn


posted on 2013-10-24 18:01  三少爷的剑123  阅读(129)  评论(0编辑  收藏  举报

导航