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

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

地點:線上c++

事情的原由

1、得知活動

這個活動當時是華工幫忙推廣,因此華工的同窗推薦給我了,很是感謝那位同窗。面試

2、入營筆試

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

最後一題是一個規劃問題:數組

記憶中大概是,蛋糕店有任務要完成N個蛋糕,剛開始有m臺生產機器和k個工人,天天能夠生產的蛋糕爲生產機器數*工人數。學習

天天生產的蛋糕能夠保留也能夠換取生產機器和人力,兌換規則爲一個生產機器或者一個工人須要p個蛋糕。spa

問最短多少天能夠完成生產任務?插件

輸入:N m k pcode

輸出:天數圖片

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

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

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

3、入營通知

入營通知我其實一開始是沒有收到的,是到時間點了我也沒有收到refuse我纔去翻了一下個人垃圾箱,結果然的是在垃圾箱裏。我以前有一次騰訊筆試的通知也被當成騷擾短信攔截了。因此之後仍是要本身翻一下,智能攔截一點也不智能。(\~^~)/

事情的通過

1、課程

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

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

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

2、自學資料

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

3、項目

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

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

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

4、面試題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;
}
相關文章
相關標籤/搜索