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

程序员面试题目总结--数组(五)【数组的后面m个数移动为前面m个数、列的前n项数据、判断整数x是否可以表示成n个连续正整数的和、数组中出现奇数次的元素、二维数组中的查找】

2014-08-01 14:41 1101 查看
21、将数组的后面m个数移动为前面m个数

题目:有n个整数,使前面各数后移m个位置,最后m个数变成最前面m个数,例如有10个数的数组,为{1,2,3,4,5,6,7,8,9,10},n=10,如果m=5,调整后变为{6,7,8,9,10,1,2,3,4,5}

分析: 可以通过递归的方法实现:

1、将前面n-m个元素的顺序颠倒

2、将后面m个元素的顺序颠倒

3、将n个元素的顺序全部颠倒

void reverse(int* begin, int* end)
{
	while(begin < end)
	{
		int tmp=*begin;
		*begin++ = *end;
		*end-- = tmp;
	}
}

void Move(int a[],int n,int m)
{
	reverse(a,a+n-m-1);
	reverse(a+n-m,a+n-1);
	reverse(a,a+n-1);
}


22、计算出序列的前n项数据
题目:正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,如何计算出Q中的前几项?例如:当a=3,b=5,N=6时,序列为3,5,6,9,10,12

分析:可以与归并排序联系起来,给定两个数组A,B,数组A存放:3*1,3*2,3*3,... 数组B存放:5*1,5*2,5*3,...有两个指针i,j,分别指向A,B的第一个元素,取Min(A[i],B[j]) 并将较小值的指针前移,然后继续比较。

void Generate(int arry[],int a, int b, int N)
{
	int tmpA,tmpB;
	int i=1;
	int j=1;
	for(int k=0;k<N;k++)
	{
		tmpA=a*i;
		tmpB=b*j;
		if(tmpA <= tmpB)
		{
			arry[k]=tmpA;
			i++;
		}
		else
		{
			arry[k]=tmpB;
			j++;
		}
	}
}


23、判断一个整数x是否可以表示成n(n>=2)个连续正整数的和

题目:判断一个整数x是否可以表示成n(n>=2)个连续正整数的和

分析: 假设x可以表示成n个连续正整数的和,则数学表达式如下:x=m+(m+1)+(m+2)+...+(m+n-1) --> x=(2m+n-1)*n/2,变换后m=(2*x/n-n+1)/2 m>=1 即判断(2*x/n-n+1)是否是偶数

int main()
{
	int m=0,n=0,start=0,end=0,flag=0;
	float tmp=0.0;
	cout << "请输入被分解的数"  << endl;
	cin >> m;
	cout << "请输入需要被分解的数字的个数" << endl;
	cin >> n;
	tmp=(float)m/n-(float)(n-1)/2;
	if(tmp==(int)tmp)
	{
		for(flag=1,start=(int)tmp,end=start+n;start<end;start++)
			cout << start <<' ';
		cout << endl;
	}
	if(flag==0)
		cout << "没有符合条件的数" << endl;
}


24、找出数组中出现奇数次的元素

题目:给定一个含有n个元素的整型数组array,其中只有一个元素出现奇数次,找出这个元素

分析: 因为对于任意一个数k;有k^k=0,k^0=k,所以将数组中所有元素进行异或,那么个数为偶数的元素异或后都变成了0,只留下了个数为奇数的那个元素

int FindElementWithOddCount(int a[], int n)
{
	int res=a[0];
	for(int i=1;i<n;i++)
	{
		res ^=a[i];
	}
	return res;
}

25、二维数组中的查找

题目:在一个二维数组matrix中,每一行都从左到右递增排序,每一列都从上到下递增排序,在这个二维数组中判断指定的数是否存在

分析:首先选取数组中右上角的数字,如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找范围,直到要查找的数字,或者查找范围为空。查找步骤图示如下:在下面的二维数组中查找7(参考于<<剑指offer>>)



bool Find(int* matrix, int rows, int columns, int number)
{
	bool found = false;

	if(matrix != NULL && rows > 0 && columns > 0)
	{
		int row = 0;
		int column = columns - 1;
		while(row < rows && column >=0)
		{
			if(matrix[row * columns + column] == number)
			{
				found = true;
				break;
			}
			else if(matrix[row * columns + column] > number)
				-- column;
			else
				++ row;
		}
	}

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