现在的位置: 首页 > 综合 > 正文

微软一道面试题

2013年08月01日 ⁄ 综合 ⁄ 共 524字 ⁄ 字号 评论关闭
一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。
  请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
  注意:
  - 5个数值允许是乱序的。比如: 8 7 5 0 6
  - 0可以通配任意数值。比如:87 5 0 6 中的0可以通配成9或者4
  - 0可以多次出现。
- 复杂度如果是O(n2)则不得分。
思路:因为数列是无序的,而且因为0的存在而富有变化,那么连续相邻这个条件中有哪些是可以保持不变的呢?我们假设这五个连续数列从小到大依次为A[0]-A[1]-A[2]-A[3]-A[4] .那么这无序的5个数字只要能填入到这个区间内,则都为有序的,否则为无序的.则这5个数字组成的区间长度至多为4,因此,我们只需要判断区间长度max-min <=4?是否成立即可.
代码:

bool isContinueSeries(int* A,int n)
{
	int max=0;
	int min=65535;
	for(int i=0;i<n;++i)
	{
		if(A[i] > max)
			max=A[i];
		if(A[i] < min)
			min=A[i];
	}
	if((max - min) <=4)
		return true;
	else return false;
}

抱歉!评论已关闭.