テンセント2016研究開発エンジニアのプログラミング問題

3015 ワード

1、グレイコードを生成する
一組の数の符号化において、いずれか2つの隣接する符号が1ビットのバイナリ数だけ異なる場合、この符号化をグレイコード(Gray Code)と呼び、1つの関数を記述し、再帰的な方法でNビットのグレイコードを生成してください.
整数nを指定すると、nビットのグレイコードを返し、0から順に返します.
テストサンプル:
1
 :["0","1"]

解法1:
class GrayCode {
public:
    vector getGray(int n) {
        vector gray;
        if(n == 1) {
            gray.push_back("0");
            gray.push_back("1");
            return gray;
        }
        vector last_gray = getGray(n-1);
        for(int i = 0; i < last_gray.size(); ++i)
            gray.push_back("0"+last_gray[i]);
       	for(int i = last_gray.size()-1; i>=0; --i)
            gray.push_back("1"+last_gray[i]);
       	return gray;
    }
};

解法2:
式G(n)=nXOR(n/2)を用いる
class GrayCode {
public:
    string getbinarystr(int num, int n){
        string binarystr = "";
        while(num){
            int remain = num%2;
            stringstream ss;
            ss << remain;
            string remainstr;
            ss >> remainstr;
            binarystr = remainstr + binarystr;
            num /= 2;
            n--;
        }
        while(n--)
            binarystr = "0" + binarystr;
        return binarystr;
    }
    vector getGray(int n) {
        int pown = pow(2,n);
        vector gray;
        for(int i = 0; i < pown; ++i){
            int graynum = i^(i>>1);
            string graystr = getbinarystr(graynum, n);
            gray.push_back(graystr);
        }
        return gray;
    }
};

2、微信のお年玉
春節の間、明ちゃんは微信を使ってお年玉をたくさんもらって、とても楽しかったです.お年玉の受け取り記録を見ると、あるお年玉の金額がお年玉の総数の半分を超えていることがわかりました.明ちゃんにこのお年玉の金額を見つけてください.具体的なアルゴリズムの構想とコードの実現を書き出して、アルゴリズムができるだけ効率的であることを要求します.
お年玉の金額配列giftsとその大きさnを指定し、求めたお年玉の金額を返してください.金額が合計の半分を超えていない場合は、0を返します.
テストサンプル:
[1,2,3,2,2],5
 :2
class Gift {
public:
    int getValue(vector gifts, int n) {
        int count = 0, temp;
        for(int i = 0; i < n; ++i){
            if(count == 0){
                temp = gifts[i];
                count = 1;
            } else {
                if(temp == gifts[i])
                    count++;
                else
                    count--;
            }
        }
        int tempCount = 0;
        for(int i = 0; i < n; ++i){
            if(temp == gifts[i])
                tempCount++;
        }
        return tempCount > n/2 ? temp: 0;
    }
};

解法2:
class Gift {
public:
    int getValue(vector gifts, int n) {
		sort(gifts.begin(), gifts.end());
        int count = 0;
        for(int i = 0; i < n; ++i){
            if(gifts[i] == gifts[n/2])
                count++;
        }
        if(count > n/2)
            return gifts[n/2];
        return 0;
    }
};