1、
在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進制數不同, 則稱這種編碼爲格雷碼(Gray Code),請編寫一個函數,使用遞歸的方法生成N位的格雷碼。
給定一個整數n,請返回n位的格雷碼,順序爲從0開始。
測試樣例:
1
返回:[“0”,”1”]。
初看題目,已經忘記格雷碼的具體規則,題目要求是遞歸實現。便考慮如何從最簡單的一位倒推二位的情況。經過演算總結出如下的規律。N位格雷碼都是n-1位格雷碼前半部分插零,後半部分插一形成,因此編碼實現如下:
class GrayCode {
public:
vector<string> getGray(int n) {
// write code here
vector<string> str;
if (n==1)
{
str.push_back("0");
//str.push_back(",");
str.push_back("1");
return str;
}
else
{
str = getGray(n-1);
vector<string> str1;
str1 = str;
for (int i = str1.size()-1; i >=0; i--)//複製一遍,可能有更好的寫法,考慮copy的用法
{
str.push_back(str1[i]);
}
for (int i = 0; i < str.size()/2; i++)
{
str[i].insert(0,"0");
}
for (int i = str.size()/2; i < str.size(); i++)
{
str[i].insert(0, "1");
}
}
return str;
}
};
2.春節期間小明使用微信收到很多個紅包,非常開心。在查看領取紅包記錄時發現,某個紅包金額出現的次數超過了紅包總數的一半。請幫小明找到該紅包金額。寫出具體算法思路和代碼實現,要求算法儘可能高效。
給定一個紅包的金額數組gifts及它的大小n,請返回所求紅包的金額。
測試樣例:
[1,2,3,2,2],5
返回:2
採用哈希或者類似數組最佳,編程之美有講,這裏做一個簡單的實現,當錢數很大時,數組浪費空間巨大,考慮優化,當然在筆試過程中,先考慮功能,在考慮優化。
class Gift {
public:
int getValue(vector<int> gifts, int n) {
// write code here
auto keyMin = minmax_element(gifts.begin(), gifts.end());
int min = *keyMin.first;
int max = *keyMin.second;
vector<int> s(max+1,0);
for (size_t i = 0; i < n; i++)
{
s[gifts.at(i)]++;
}
auto m = max_element(s.begin(), s.end());
if (*m<=n/2)
{
return 0;
}
return m-s.begin();
}
};
import java.util.*;
public class Gift {
public int getValue(int[] gifts, int n) {
Arrays.sort(gifts);
int ans = gifts[n/2];
int num = 0;
for(int i = 0; i < gifts.length; i++) {
if(gifts[i] == ans) {
num++;
}
}
return num <= n/2 ? 0 : ans;
}
}
排序並取中間元素不知道這兩個算法該怎麼評價,第一個應該是O(n),空間損耗高,第二個O(nlogn),空間可做到O(1)