码迷,mamicode.com
首页 > 编程语言 > 详细

剑指offer面试题38:数字在排序数组中出现的次数

时间:2015-04-01 23:48:46      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:
统计一个数字在排序数组中出现的次数。
输入:

每个测试案例包括两行:

第一行有1个整数n,表示数组的大小。1<=n <= 10^6。

第二行有n个整数,表示数组元素,每个元素均为int。

第三行有1个整数m,表示接下来有m次查询。1<=m<=10^3。

下面有m行,每行有一个整数k,表示要查询的数。

输出:
对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数。

样例输入:
81 2 3 3 3 3 4 513
样例输出:
4


//source:http://ac.jobdu.com/problem.php?pid=1349
#include <iostream>
#include <cstdio>
using namespace std;

bool flag1 = true;
bool flag2 = true;
int SearchFirst(int A[], int n, int value)
{
	int left = 0, right = n - 1;
	while (left <= right)
	{
		int mid = (left + right)/2;
		if (A[mid] < value)
			left = mid + 1;
		else if (A[mid] > value)
			right = mid - 1;
		else
		{
			if (A[mid - 1] != value || mid == 0)//mid==0
				return mid;
			else
				right = mid - 1;
		}
	}
	flag1 = false;
	return 0;
}

int SearchLast(int A[],int n, int value)
{
	int left = 0, right = n - 1;
	while (left <= right)
	{
		int mid = (left + right)/2;
		if (A[mid] < value)
			left = mid + 1;
		else if (A[mid] > value)
			right = mid - 1;
		else
		{
			if (A[mid + 1] != value || mid == n)//mid==n
				return mid;
			else
				left = mid + 1;
		}
	}
	flag2 = false;
	return 0;
}

int main()
{
	int n, m;//n是数组的大小,m是查询的次数
	int k;//要查询的数
	while (scanf("%d",&n)!=EOF)
	{
		int *array = new int[n+1];
		for (int i = 0; i < n; i++)
		{
			scanf("%d", array+i);
		}

		scanf ("%d",&m);
		while (m--)
		{
			scanf("%d",&k);
			int first =SearchFirst(array,n,k);
			int last = SearchLast(array,n,k);
			if (!flag1 && !flag2)
				printf("0\n");
			else
				printf("%d\n",last - first + 1);
		}
	}
	return 0;
}


剑指offer面试题38:数字在排序数组中出现的次数

标签:

原文地址:http://blog.csdn.net/hnuzengchao/article/details/44816559

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!