字节跳动2019校园招聘研发岗位在线第三次笔试-2018.09.09

版权声明:本人ZZU在校学生,文章均为个人心得,有不足之处请不吝赐教! https://blog.csdn.net/whl_program/article/details/82599437

前四道题都是LeetCode原题,题号在注释中给出
1-1.png

//求字符串最大不重复子串 LeetCode 第3题
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <math.h>
#include <algorithm>
using namespace std;
int getLongestSubString(string s){
    int arr[256];   //数组中存放的是每一个字符的下标位置;
    memset(arr, -1, sizeof(arr));
    int pre = 0;
    int maxLen = 0;  //pre用来存放出现不重复子串的首地址
    int n = s.length();
    for (int i=0; i<n; i++){
        if (arr[s[i]] != -1){
            if (arr[s[i]] >= pre){
                pre = arr[s[i]] + 1;
            }
            arr[s[i]] = i;
        }
        else{
            arr[s[i]] = i;
        }
        maxLen = max(maxLen, i-pre+1);
    }
    return maxLen;
}

int main()
{
    string str;
    getline(cin, str);
    cout << getLongestSubString(str) << endl;
    return 0;
}

2-1.png
2-2.png

//LeetCode 第200题
#include <iostream>
#include <vector>
using namespace std;
int dfs(vector<vector<int>>& numOfBG, int x, int y,vector<vector<bool>>& vis){
    if(x >=  numOfBG.size() || y >= numOfBG[0].size() || x < 0 || y < 0)
        return 0;
    if(vis[x][y] == true)
        return 0;
    if(numOfBG[x][y] == 0)
        return 0;
    // 对于点[x,y]搜索上下左右4个点是否是岛屿
    // 即[x-1,y],[x+1,y],[x,y-1],[x,y+1]
    // 对于已经搜索过的点要进行标记
    vis[x][y] = true;
    // 遍历周围4个点
    return 1 + dfs(numOfBG, x+1, y, vis) + dfs(numOfBG, x-1, y, vis) + dfs(numOfBG, x, y+1, vis) + dfs(numOfBG, x, y-1, vis);
}
void maxOfBG(vector<vector<int>>& numOfBG) {
    if(numOfBG.empty())
        return;
    int num = 0;
    //int res = 0;
    vector<vector<bool>> vis(numOfBG.size(),vector<bool>(numOfBG[0].size(),false));// 定义标记数组
    // 定义搜索边界
    int mostDeep = numOfBG.size();
    int mostRight = numOfBG[0].size();
    //开始搜索
    for(int i = 0;i < mostDeep;i++){
        for(int j = 0;j < mostRight;j++){
            if(vis[i][j] == true)
                continue;
            if(numOfBG[i][j] == 0){
                vis[i][j] = true;
                continue;
            }
            dfs(numOfBG, i, j, vis);
            int temp = dfs(numOfBG, i, j, vis);
            ++num;
            //grid[i][j] = 8;
            //res = res>temp ? res : temp;
        }
    }
    cout << num << endl;
}

int main()
{
    int m;
    cin >> m;
    vector<vector<int>> numOfBG(m, vector<int>(m,0));
    for(int i=0; i<m; i++){
        for(int j=0; j<m; j++){
            cin >> numOfBG[i][j];
        }
    }
    maxOfBG(numOfBG);
    return 0;
}

3-1.png

//LeetCode 第93题
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <bits/stdc++.h>
using namespace std;

bool isValidIP(string str){
    if (str.size()>1 && str[0]=='0')
        return false;
    int res = atoi(str.c_str());
    return res<=255 && res>=0;
}

void DFS(string str, string half, int &res, int count){
    if (count==3 && isValidIP(str)){
        res++;
        return;
    }
    //可以取1-3个字符
    for (int i=1; i<=3&&i<str.size(); ++i){//特别需要注意i<s.size(){
        string stemp = str.substr(0, i);
        if(isValidIP(stemp))
            DFS(str.substr(i), half+stemp+".", res, count+1);
    }
}

int main(){
    string str;
    getline(cin, str);
    if (str.size()<4 || str.size()>12)
        return 0;
    int res = 0;//如果需要统计所有IP,只需要将res换成数组,在res++的地方进行push_back即可
    DFS(str, "", res, 0);
    cout << res << endl;
    return 0;
}

4-1.png
4-2.png

//LeetCode 第393题
#include <bits/stdc++.h>

using namespace std;

bool isUTF8(vector<int>& arr) {
    int mask1=128, mask2=192, cnt=0;
    for(int i = 0; i < arr.size(); i++){
        int cur = arr[i];

        if (cnt == 0) {
            while ((cur & mask1) != 0){
                cur <<= 1;
                cnt++;
            }
            if (cnt == 1)
                return false;
            cnt = max(0, cnt - 1);
        }else{
            if ((arr[i] & mask2) != mask1)
                return false;
            cnt--;
        }
    }
    return cnt == 0;
}

int main()
{
    int n;
    cin >> n;
    vector<int> arr;
    for(int i=0; i<n; i++){
        int temp;
        cin >> temp;
        arr.push_back(temp);
    }
    cout << isUTF8(arr) << endl;
    return 0;
}

5-1.png
5-2.png
这个题当时没搞出来,主要是Tarjan算法 有向连通图问题

#include <iostream>

using namespace std;

void eee(int **canshu,int ki,int * aswdd,int cc);

int main() {
    int N,M;
    int x,y,result=0;
    scanf("%d",&N);
    scanf("%d",&M);
    int ** a =new int*[N];
    for (int i = 0;i<N;i++)
        a[i] = new int[N];
    for(int i=0;i<N;i++){
        for (int j =0;j<N;j++){
            a[i][j]=0;
        }
    }
    for (int i =0;i<M;i++){
        cin >> x >> y;
        a[x-1][y-1] = 1;
    }
    int * b =new int[N];
    int flag =0;
    for (int i = 0;i<N;i++){
        flag = 0;
        for (int j =0;j<N;j++)
            b[j]=0;
        b[i]=1;
        eee(a,N,b,i);
        for (int j=0;j<N;j++)
            if (b[j]==0)
                flag = 1;
        if (flag == 0)
            result++;
    }
    cout << result <<endl;

    for (int i=0;i<N;i++)
        delete [] a[i];
    delete [] a;
    system("pause");
    return 0;
}

void eee(int **canshu,int ki,int * aswdd,int cc){
    int **a1 =canshu;
    int a2 =ki;
    int *a3 =aswdd;
    int a4=cc;
    if (aswdd[cc]>1)
        return;
    for (int i = 0;i<ki;i++){
        if (canshu[i][cc]==1){
            aswdd[i]++;
            eee(a1,a2,a3,i);
        }
    }
}



猜你喜欢

转载自blog.csdn.net/whl_program/article/details/82599437