1. 程式人生 > >騰訊秋招筆試題答案

騰訊秋招筆試題答案

1.

#include <iostream>
#include <string.h>
using namespace std;

char str[101];
int base[4];

int main()
{
    while(cin>>str)
    {
        int len = strlen(str);
        base[3] = 1;
        for(int i=2;i>=0;i--)
        {
            base[i] = base[i+1]*25+1;
        }

        int _index = 0;
        for(int j=0;j<len;j++)
        {
            _index += ((str[j]-'a')*base[j]+1);
        }
        cout<<_index-1<<endl;
    }
    return 0;
}
2.
#include <iostream>
using namespace std;

unsigned int arr[32];

int main()
{
    int id1, id2;
    while(cin>>id1>>id2)
    {
        int group1 = (id1-1)/32, group2 = (id2-1)/32;
        if(!(id2>=1&&id2<=1024))
        {
            cout<<-1<<endl;
            continue;
        }
        arr[group1] |= (1<<((id1-1)%32));
        cout<<( (arr[group2] & (1<<((id2-1)%32))) != 0)<<endl;
    }
    return 0;
}
3.
#include<iostream>
#include<math.h>
using namespace std;
bool isPrime(unsigned int num)
{
    for(int i=2;i<=sqrt(num);i++)
        if(num%i==0)
            return false;
    return true;
}

int main()
{
    unsigned int number;
    while(cin>>number)
    {
        unsigned int index=0;
        for(int i=2;i<=(number/2);i++)
        {
            if(isPrime(i))
                if(isPrime(number-i))
                    index++;
        }
        cout<<index;
    }
    return 0;
}
4.
#include<iostream>
using namespace std;
int main()
{
    double test;
    
    while(cin>>test)
    {
        int start=-90,end=90;
        for(int i=0;i<6;i++)
        {
            int mid=(int)((start+end)/2);
            if(test<mid)
            {
                end=mid;
                cout<<0;
            }
            else
            {
                start=mid;
                cout<<1;
            }
        }
    }
    return 0;
}
5.

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

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

測試樣例:
1
返回:["0","1"]

class GrayCode {
public:
    vector<string> getGray(int n) {
        vector<string> v;  
        if(n == 1)  
        {  
            v.push_back("0");  
            v.push_back("1");  

            return v;  
        }  
        else  
        {  
            vector<string> v = getGray(n - 1);  
            int vSize = v.size();  

            vector<string> v2;  

            for(int i = 0; i < vSize; i++)  
            {  
                if(i % 2 == 0)  
                {  
                    v2.push_back(v[i]+"0");  
                    v2.push_back(v[i]+"1");  
                }  
                else  
                {  
                    v2.push_back(v[i]+"1");  
                    v2.push_back(v[i]+"0");  
                }  
            }  

            return v2;  
        } 
            // write code here
    }
};

6.

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

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

若沒有金額超過總數的一半,返回0。 測試樣例:
[1,2,3,2,2],5
返回:2
class Gift {
public:
    int getValue(vector<int> gifts, int n) {
        int result,value=0;
        for(int i = 0;i < n;++i){
            result=0;
            for(int j = 0;j < n;++j){
                if(j!=i)
                {
                    if(gifts[j]==gifts[i])
                    {
                        result++;
                        
                    }
                }
            }
            if(result>n/2)
            {
                value=gifts[i];
                break;
            }
    	}
        return value;
        // write code here
    }
};