2020 春招 華為筆試 2月26日


時間是兩個小時,總共三道編程題目。

第一道題目大意:

  輸入一個int類型的數,判斷它的比特流中有多少個“010”,及第一個“101”的下標(這個下標是從低位向高位數的)。

  如:輸入:21   

    輸出   2 0

       原因:21  二進制表示為  0000 0000 0000 0000 0000 0000 0001 0101        

       總共兩個“101”(兩個“101”可以重疊), 且第一個下標為0,第二個下標為2,所以返回2 0

提交代碼如下

 1 int main(){
 2     int num;
 3     while(cin >> num){
 4         int tag = 5, tag1 = 2;// 分別是101  和  010
 5         int times = 0, numcnt = 30, firstindex = -1;
 6         while(numcnt --){
 7             if((num & tag) == tag && (num & tag1) == 0){
 8                 times ++;
 9                 if(firstindex == -1)
10                     firstindex = 29 - numcnt;
11             }
12             tag <<= 1;
13             tag1 <<= 1;
14         }
15         cout << times << " " << firstindex << endl;
16     }
17     return 0;
18 }
View Code

 

第二道題目大意:

背景:數據庫一條記錄(包括多個字段:數值,字符串)合並成一個字符串作為輸入,現在的任務是將不同的字段分類開來,輸出字段的數目和每個字段的內容。

輸入一行字符串,將其分割成多段,輸入的字符串應滿足的條件:

  1. 輸入的字符串沒有空格
  2. 不同的字段之間以逗號分隔
  3. 如果一個字段內有逗號(“,”)或者引號(“"”),則該字段首尾會加上引號(“"”),且字段內的引號寫作""(兩個引號)

若輸入的字符串有問題,則輸出ERROR;

否則,輸出字段個數,然后輸出每個字段    (各占一行)

我的思路是:因為每個字段引號都是成對的,所以遇見逗號的時候判斷此時引號是否成對。若不成對,說明該逗號是字段內部的逗號;反之,該逗號為兩字段的分隔號。

提交代碼如下:

 1 int main(){
 2     int num;
 3     string inStr;
 4     while(getline(cin,inStr)){
 5         if(inStr.size() == 0){
 6             cout << 0 << endl;
 7             continue;
 8         }
 9         int lastIndex = -1;
10         stack<char> charStack;
11         vector<string> strVec;
12         for(int i = 0; i < inStr.size(); ++ i){
13             if(inStr[i] == '"'){
14                 charStack.empty() ? charStack.push('"') : charStack.pop();
15             }
16             if(inStr[i] == ',' && charStack.empty()){
17                 strVec.push_back(inStr.substr(lastIndex+1, i-lastIndex-1));
18                 lastIndex = i;
19             }
20         }
21         if(!charStack.empty()){
22             cout << "ERROR" <<endl;
23             continue;
24         }
25         strVec.push_back(inStr.substr(lastIndex+1, inStr.size()-lastIndex-1));
26         cout << strVec.size() << endl;
27         for(int i = 0; i < strVec.size(); ++ i){
28             if(strVec[i].size() == 0 || (strVec[i].size() == 2 && strVec[i][0] == '"' && strVec[i][1] == '"'))
29                 cout << "--" <<endl;
30             else if(strVec[i][0] == '"'){
31                 bool flag = false;
32                 for(auto it = strVec[i].begin()+1; it != strVec[i].end(); ++ it){
33                     if(*it == '"'){
34                         if(flag){
35                             printf("\"");
36                             flag = false;
37                         }
38                         else
39                             flag = true;
40                     }
41                     else
42                         printf("%c", *it);
43                 }
44                 printf("\n");
45             }
46             else
47                 cout << strVec[i] << endl;
48         }
49     }
50     return 0;
51 }
View Code

 

 

第三道題目大意:

背景:好友推薦功能,A和B是好友,B和C是好友,A和C不是好友,則C是A的2度好友;A和B的熟悉度為m,B和C的熟悉度為n,則A和C的推薦度為m+n;

輸入:測試用例個數T;

   然后輸入每個測試用例:用戶數m,某個特定用戶的id,要求的好友度數t,已知的好友數目n

              接下來輸入n行,每行的內容為:用戶1的id 用戶2的id 兩用戶的熟悉度

輸出:先輸出特定用戶的t度好友個數,沒有則輸出-1;若有,接下來一次輸出用戶id,按照推薦度從高到低(若推薦度相同,按照id從小到大)

當時的思路是:dijkstra算法找到特定用戶t度好友,然后進行排序輸出。(但是印象中題目在有兩個距離相同的路徑時,推薦度采用最高那個還是第一個沒有說清楚,也可能是我沒理解清楚題意。當時我是注釋了部分代碼又提交了一下。)

當時提交過了40%,提交代碼如下:

int T, userCnt, userId, friendVal, pairCnt;

int dist[50];
int friendValSum[50];
int routeMatrix[50][50];
int valMatrix[50][50];
void dijkstra(int root){
    memset(dist, 0x7f, sizeof(dist));
    memset(friendValSum, 0, sizeof(friendValSum));
    for(int i = 0; i < userCnt; ++ i)
        dist[i] = routeMatrix[root][i];
    for(int i = 0; i < userCnt; ++ i)
        friendValSum[i] = valMatrix[root][i];
    dist[root] = 0;
    vector<bool> flagVec(50,false);
    flagVec[root] = true;
    for(int j = 1; j < userCnt; ++ j){
        int minDis = INF, v = -1;
        for(int i = 0; i < userCnt; ++i){
            if(!flagVec[i] && dist[i] < minDis){
                minDis = dist[i];
                v = i;
            }
        }
        if(v == -1 || minDis > friendVal)
            return;
        flagVec[v] = true;
        for(int i = 0; i < userCnt; ++ i){
            if(!flagVec[i] && routeMatrix[v][i] + dist[v] < dist[i]){
                dist[i] = routeMatrix[v][i] + dist[v];
                friendValSum[i] = valMatrix[v][i] + friendValSum[v];
            }
            /*else if(!flagVec[i] && routeMatrix[v][i] + dist[v] == dist[i] && valMatrix[v][i] + friendValSum[v] > friendValSum[i]){
                friendValSum[i] = valMatrix[v][i] + friendValSum[v];
            }*/
        }
    }
}

typedef struct NODE{
    int id, val;
    NODE(int d, int v):id(d),val(v){}
}node;
bool cmp(node a, node b){
    if(a.val != b.val)
        return a.val > b.val;
    else
        return a.id < b.id;
}
int main(){
    int tmpSt, tmpEnd, tmpVal;
    cin >> T;
    while(T--){
        cin >> userCnt >> userId >> friendVal;
        cin >> pairCnt;
        memset(routeMatrix, 0x7f, sizeof(routeMatrix));
        memset(valMatrix, 0x7f, sizeof(valMatrix));
        for(int i = 0; i < pairCnt; ++ i){
            scanf("%d %d %d", &tmpSt, &tmpEnd, &tmpVal);
            routeMatrix[tmpSt][tmpEnd] = 1;
            routeMatrix[tmpEnd][tmpSt] = 1;
            valMatrix[tmpSt][tmpEnd] = tmpVal;
            valMatrix[tmpEnd][tmpSt] = tmpVal;
        }
        dijkstra(userId);
        //if(friendVal == 0){
        //    cout << "-1" << endl;
        //    continue;
        //}
        vector<node> nodeVec;
        for(int i = 0; i < userCnt; ++ i){
            if(dist[i] == friendVal){
                nodeVec.push_back(NODE(i, friendValSum[i]));
            }
        }
        if(nodeVec.size() == 0)
            cout << "-1" << endl;
        else{
            sort(nodeVec.begin(), nodeVec.end(), cmp);
            bool flag = false;
            for(int i = 0; i < nodeVec.size(); ++i){
                flag ? printf(" ") :flag = true;
                printf("%d", nodeVec[i].id);
            }
        }
        printf("\n");
    }
    return 0;
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM