【筆試練習】騰訊2016筆試題

1.生成格雷碼

在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進制數不同, 則稱這種編碼爲格雷碼(Gray Code),請編寫一個函數,使用遞歸的方法生成N位的格雷碼。

給定一個整數n,請返回n位的格雷碼,順序爲從0開始。

測試樣例:
1
返回:["0","1"]
問題分析:對於這樣的題目,我們可以進行找規律完成。

當n == 1時,生成的1位格雷碼是“0”,“1”

當n == 2時,生成的2位格雷碼是“00”、“01”、“11”、“10”(相鄰的兩個數只有一個二進制位不同)

當n == 3時,生成的3位格雷碼是“000”、“001”、“011”、“010”、“110”、“111”、“101”、“100”。

根據這樣的規律,可以寫出遞歸代碼:

class GrayCode {
public:
	vector<string> getGray(int n) {
		// write code here
		vector<string> grayCode;
		if (n == 1)
		{
			grayCode.push_back("0");
			grayCode.push_back("1");
			return grayCode;
		}
		vector<string> last = getGray(n-1);
		for (int i = 0; i < last.size(); ++i)
		{
			grayCode.push_back("0"+last[i]);
		}
		for (int i = last.size()-1; i >= 0 ; --i)
		{
			grayCode.push_back("1" + last[i]);
		}
		return grayCode;
	}
};

2.微信紅包

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

給定一個紅包的金額數組gifts及它的大小n,請返回所求紅包的金額。

若沒有金額超過總數的一半,返回0。
測試樣例:
[1,2,3,2,2],5
返回:2
問題分析:對於這個題目,我們可以統計出數組中每個元素出現的次數,找出次數超過一半的數字,這裏可以藉助關聯容器map。

代碼實現:

class Gift {
public:
	int getValue(vector<int> gifts, int n) {
		// write code here
		if (n <= 0)
			return 0;
		map<int, int> m;
		for (int i = 0; i < n; ++i)
		{
			m[gifts[i]]++;
		}
		map<int, int>::iterator itMap = m.begin();
		while (itMap != m.end())
		{
			if (itMap->second > n / 2)
				break;
			else
				++itMap;
		}
		if (itMap == m.end())
			return 0;
		else
			return itMap->first;
	}
};









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