• 字节跳动_玩转客户端训练营


    时间: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;
    }
    
    
  • 相关阅读:
    php 多进程
    关于TP的RBAC的使用
    谈谈自己对于Auth2.0的见解
    php 写队列
    关于thinkphp中Hook钩子的解析
    JS的闭包
    单链表的查找和取值-1
    shell输入输出重定向
    转-Visual Studio控制台程序输出窗口一闪而过的解决方法
    linux下如何调用不同目录下的.h 库文件
  • 原文地址:https://www.cnblogs.com/xuanyu-10-18/p/13221758.html
Copyright © 2020-2023  润新知