2016騰訊研發校招編程二道

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)

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