字節跳動_玩轉客戶端訓練營


時間:2020年5月20日-2020年6月28日

地點:線上

事情的起因

一、得知活動

這個活動當時是華工幫忙推廣,所以華工的同學推薦給我了,非常感謝那位同學。

二、入營筆試

入營筆試有三道題,只做出了兩道題,沒有把題目記錄下來有點可惜。

最后一題是一個規划問題:

記憶中大概是,蛋糕店有任務要完成N個蛋糕,剛開始有m台生產機器和k個工人,每天可以生產的蛋糕為生產機器數*工人數。

每天生產的蛋糕可以保留也可以換取生產機器和人力,兌換規則為一個生產機器或者一個工人需要p個蛋糕。

問最短多少天可以完成生產任務?

輸入:N m k p

輸出:天數

我當時大概的思路是這個樣子的,由(n-m)(n+m)<n*n可以得到,我們要盡量保證生產機器和工人數量盡可能接近。

其次考慮成本的話,我們要決定用不用蛋糕換取勞動力,而這里就是我沒有想清楚的地方,最后只能不考慮成本混過一些樣例。

因為實在忘了,也不知道題目是不是我記得的這樣,就不補題了。

三、入營通知

入營通知我其實一開始是沒有收到的,是到時間點了我也沒有收到refuse我才去翻了一下我的垃圾箱,結果真的是在垃圾箱里。我之前有一次騰訊筆試的通知也被當成騷擾短信攔截了。所以以后還是要自己翻一下,智能攔截一點也不智能。(\~^~)/

事情的經過

一、課程

  • Android插件化/熱修復技術介紹

  • IOS逆向/破解方向技術介紹

都是介紹性的知識居多,所以訓練營結束后還要下來好好學習。

二、自學資料

這次訓練營的過程中主要看的就是《第一行代碼》了。

三、項目

項目大作業就是做一個類手機相冊,可以瀏覽縮略圖、查看大圖、編輯圖片、保存/刪除圖片、局域網傳輸圖片。

我負責的是編輯圖片這一塊,就是旋轉、裁剪、塗鴉。塗鴉這一塊我只通過重寫ImageView實現了繪制的基本功能,還不能擦除、不能改變畫筆大小、顏色什么的。

定一個小目標就是我想要把這個功能繼續完善了。

四、筆試題share

這次訓練營過程中,還share了一道字節的筆試題:

Q1—尋寶之旅

  • 問題描述

  • 小明獲得了一張由n行m列矩陣構成的藏寶圖,在這張網格地圖上有一部分格子中標明了鑽石的數量(1~9),其他格子均是障礙物不可到達。已知小明可以從任意一個含有寶藏的格子出發,每次沿着上下左右之一的方向走一格,但不能走到障礙格中,也不能重復經過一個寶藏格,然后把沿途經過的鑽石都撿起來。他現在需要制定一條路線,使得根據這個路線先后順序排列鑽石數組成的數字最大。請幫忙找出這個最大的數字。

  • 輸入格式

    • 第一行輸入N和M, 分別表示藏寶圖矩陣的行和列, 2<N,M<20
    • 接下了N行,每行輸入M個數字c,空格隔開, 0≤c<10
  • 輸出格式

  • 返回整數m,表示最大數字

  • 輸入樣例

5 6
0 0 0 0 0 0
0 7 8 9 4 0
0 2 3 7 0 0
0 4 5 0 0 0
0 0 0 0 3 2 
  • 輸出樣例
872453794
  • 數據范圍

    • 2<N,M<20

我的解題思路

一開始看到題腦子里就是並查集找最大集合然后BFS從最大數開始遍歷,仔細一想,才發現大錯特錯,那就只能DFS+BFS+剪枝了。

代碼

#include <vector>
#include <string>
#include <iostream>

using namespace std;

#define N 23
#define M 23

int graph[N][M];

bool vis[N][M],visBfs[N][M];

int direct[4] = {1,0,-1,0};

string temp,ans;

/*******************************圖展示*******************************/
void showGraph(int n, int m, bool flag = true){
    for(int i=0; i<=n+1; i++){
        for(int j=0; j<=m+1; j++){
            if(flag) cout<<graph[i][j]<<' ';
            else cout<<vis[i][j]<<' ';
        }
        cout<<endl;
    }
}
/*******************************圖展示*******************************/

inline bool strCompare(string a,string b){
    unsigned long lena = a.length();
    unsigned long lenb = b.length();
    return lena<lenb || (lena==lenb && a<b);
}

int getResBfs(int i, int j){
    int len = 0;
    vector<int> q;
    q.push_back(i*25+j);
    while(!q.empty()){
        int x = q.back();
        int y = x % 25;
        x /= 25;
        q.pop_back();
        for (int k=0; k<4; k++) {
            int n = x+direct[k];
            int m = y+direct[(k+1)%4];
            if(graph[n][m]!=0 && vis[n][m]==0 && visBfs[n][m]==0){
                visBfs[n][m] = 1;
                q.push_back(n*25+m);
                len ++;
            }
        }
    }
    return len;
}

void dfs(int i, int j){
    /*******************************未剪枝*******************************/
    // cout<<temp<<' '<<ans<<endl;
    /*
     if(strCompare(ans, temp)) ans = temp;
     else {}
     for (int k=0; k<4; k++) {
         int n = i+direct[k];
         int m = j+direct[(k+1)%4];
         if(graph[n][m]!=0 && vis[n][m]==0){
             vis[n][m] = 1;
             temp.push_back(graph[n][m]+'0');
             dfs(n, m);
             temp.pop_back();
             vis[n][m] = 0;
         }
     }
     */
    /*******************************未剪枝*******************************/
    /********************************剪枝********************************/
    // cout<<temp<<' '<<ans<<endl;
     if(strCompare(ans, temp)) ans = temp;
     else {
         memset(visBfs, 0, sizeof(visBfs));
         int resLen = getResBfs(i,j);
         if(resLen + temp.length() < ans.length()) return;
     }
     for (int k=0; k<4; k++) {
         int n = i+direct[k];
         int m = j+direct[(k+1)%4];
         if(graph[n][m]!=0 && vis[n][m]==0){
             vis[n][m] = 1;
             temp.push_back(graph[n][m]+'0');
             dfs(n, m);
             temp.pop_back();
             vis[n][m] = 0;
         }
     }
    /********************************剪枝********************************/
}

int main(){
    int n,m;
    ios::sync_with_stdio(false);
    cin>>n>>m;
    memset(graph, 0, sizeof(graph));
    ans = "";
    temp = "";
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            cin>>graph[i][j];
            vis[i][j] = 0;
        }
    }
    // showGraph(n,m);
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            if(graph[i][j]!=0){
                vis[i][j] = 1;
                temp.push_back(graph[i][j]+'0');
                dfs(i,j);
                temp.pop_back();
                vis[i][j] = 0;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}


免責聲明!

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



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