小米筆試_2012_09_17

前面的水題直接飄過,進入算法題部分。

算法題一:

有一個數組a,a中有n個數,現在有一個數組b用做結果數組,在數組a中,對於每一個元素a[i],求出了a數組中除了該元素以外其他元素的乘積,並且置於b數組中返回。一道很水的題目,用乘積之和除以每一個元素就可以了,竟然沒考慮0,實在不應該。以後每做除法必須要考慮被除數爲零的情況。

其實這道題在網上是有原題的,原題的條件比較苛刻,不允許用除法,而且必須用O(n)的時間複雜度和O(1)的空間複雜度。地址如下:http://blog.csdn.net/huagong_adu/article/details/7457948

這裏我自己寫了一遍供大家參考:

#include<iostream>
using namespace std;

int* getTheProduct(int numbers[],int n)
{
	if(numbers==NULL || n<=0)
		return NULL;

	int* result = new int[n];
	result[n-1]=1;

	for(int i=n-1;i>0;i--)
		result[i-1] = numbers[i]*result[i];

	for(int i=0;i<n-1;i++)
	{
		result[i] *= result[n-1];
		result[n-1] *= numbers[i];
	}

	return result;
}


int main()
{
	//just for testing 
	int numbers[] = {2,6,8,10,12};
	int* result = getTheProduct(numbers,5);
	for(int i=0;i<5;i++)
		cout<<result[i]<<endl;
	delete[] result;
}


算法題二:

設有一個數組numbers,其中有n個元素,n個元素中有三個稱爲奇異數的元素出現切僅出現了一次,其他元素都出現且僅出現兩次,設計一個算法,找出這三個奇異數中的一個,比如說輸入數組是numbers{1,2,3,4,5,6,7,6,5,2,1},輸出3,4,7中的任意一個數字。

算法思想:算法主幹是模仿快速排序,找到一個pivot,將小於等於pivot的數字都置於pivot前面,大於pivot的數字都置於pivot後面,這樣數字被爲兩個部分,pivot歸於左邊,肯定有一個部分有奇數個數字,有一部分有偶數個數字,奇數個數字的那一部分裏面至少有一個數字是隻出現一次的,那麼應用這個方法繼續在那一部分數字上劃分,直到最後只有一個數字,這個數字就是隻出現一次的那個數字。

這個算法的時間複雜度是O(n),空間複雜度是O(1),在各個算法裏面應該算是比較好的算法。

還有一種基於異或的牛逼的辦法,考試的時候沒想出來,http://blog.csdn.net/orzlzro/article/details/6394412

自己寫了一個好像還有點問題,留作以後再檢查吧

#include<iostream>
using namespace std;

int getTheNumber(int numbers[],int left,int right)
{
	int index = left;
	int preIndex = left-1;

	while(index < right-1)
	{
		if(numbers[index] <= numbers[right])
		{
			preIndex++;
			int temp = numbers[index];
			numbers[index] = numbers[preIndex];
			numbers[preIndex] = temp;
		}
		index++;
	}

	preIndex++;
	int temp = numbers[preIndex];
	numbers[preIndex] = numbers[right];
	numbers[right] = temp;

	int flag = preIndex-left+1;

	if(flag==1)
		return numbers[preIndex];
	else if(flag%2==1)
		return getTheNumber(numbers,left,preIndex);
	else
		return getTheNumber(numbers,preIndex+1,right);
}


int main()
{
	//just for testing 
	int numbers[] = {2,7,6,6,8,9,10,12,9,2,7};
	int result = getTheNumber(numbers,0,10);
	cout<<result<<endl;
}


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