程序員面試題目總結--數組(五)【數組的後面m個數移動爲前面m個數、列的前n項數據、判斷整數x是否可以表示成n個連續正整數的和、數組中出現奇數次的元素、二維數組中的查找】

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;
}


發佈了28 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章