面試題的那些事(1)

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

測試樣例:數組

[1,2,3,2,2]  5微信

返回:2ide


解題思路:測試

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

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;//沒有出現一半
}

二、有36輛自動×××和6條跑道,沒有計時器的前提下,最少用幾回比賽能夠篩選出最快的三輛×××?io


解題思路:class

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輛車的第一名。di


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次比賽則能夠篩選出最快的三輛×××。

相關文章
相關標籤/搜索