基于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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值