面試題的那些事(1)

1、春節期間小明使用微信收到很多個紅包,非常開心。在查看領取紅包記錄時發現,某個紅包金額出現的次數超過了紅包總數的一半。請幫小明找到該紅包金額。寫出具體算法思路和代碼實現,要求算法儘可能高效。給定一個紅包的金額數組gifts及它的大小n,請返回所求紅包的金額。

測試樣例:

[1,2,3,2,2]  5

返回:2


解題思路:

採用陣地攻守的思想: 第一個數字作爲第一個士兵,守陣地;count = 1; 遇到相同元素,count++; 遇到不相同元素,即爲敵人,同歸於盡,count--;當遇到count爲0的情況,又以新的i值作爲守陣地的士兵,繼續下去,到最後還留在陣地上的士兵,有可能是主元素,也有可能是最後一個元素。再加一次循環,記錄這個士兵的個數看是否大於數組一般即可。

int MoreThanHalfNum_Solution(int* gifts, int size)
{
	if (gifts == NULL)
	{
		return 0;;
	}//參數錯誤

	int count = 1;//計數器記錄士兵的生命值
	int soldier = gifts[0];//士兵初始化爲第一個數字

	for (int i = 1; i < size; i++)
	{

		if (soldier == gifts[i])//遇到相同的元素士兵生命值增加
		{
			count++;
		}
		else//遇到不相同的元素士兵生命值減少
		{
			count--;
		}

		if (count == 0)//士兵的生命值爲0時將下一個元素重新賦給士兵
		{
			soldier = gifts[++i];
			count = 1;//士兵生命值爲1
		}

	}

	count = 0;
	for (int j = 0; j < size; j++)
	{
		if (soldier == gifts[j])
		{
			count++;//計數器記錄該士兵出現的次數
		}
	}

	if (count > size / 2)
	{
		return soldier;//士兵出現的次數大於一半
	}

	return 0;//沒有出現一半
}

2、有36輛自動賽車和6條跑道,沒有計時器的前提下,最少用幾次比賽可以篩選出最快的三輛賽車?


解題思路:

1)首先將36輛車分爲6組進行一次比賽,這是必不可少的,假設六組的代碼分別爲A,B,C,D,E,F。通過6次比賽可以分別的找到每組的第一名A1,B1,C1,D1,E1,F1。


2)接下來就可以再進行第7場比賽,讓各小組的第一名A1,B1,C1,D1,E1,F1進行比賽,淘汰掉後三名假設爲D1,E1,F1,進而可以將D,E,F三組整個淘汰。並且得到6組的第一名,假設爲A1,同時也爲36輛車的第一名。


3)進行最後一場比賽,因爲第一名已經決出爲A1,同時只剩下B1,C1,A2,B2,C2,A3,B3,C3,從其中找到第2名和第3名,通過分析可以得到,如果在已知的比賽結果中如果存在2輛車跑的比他快,則可以直接淘汰,因爲就算成績最好的結果下他也爲第4名。

由於:

B1>B2>B3

C1>C2>C3

B1>C1>C2

所以B3,C3,C2可以直接淘汰,最後剩下的待確定的賽車爲B1,C1,B2,A2,A3


綜上所述,最少8次比賽則可以篩選出最快的三輛賽車。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章