题解征集|发812字节跳动题解,攒人品,赢牛客T恤!

812字节跳动笔试结束!你考的怎么样?~
欢迎大家发自己的题解哦,筱茜会从中挑选一位送上牛客定制T恤一件~~



规则:

- 在牛客讨论区“笔经面经”板块发布你的题解
- 在本帖下回复你的题解链接即可~

--------------------------------
字节跳动笔试讨论专帖:https://www.nowcoder.com/discuss/93143
与更多牛友一起讨论笔试吧~
#题解#
全部评论
#include<stdio.h> int m,n; int man[1001][1001]; int sum,num,maxnum; void search(int i,int j,int flag){  if(flag == 1){   num=1;   man[i][j]=0;  }  if(i!=0&&j!=0&&man[i-1][j-1]){   man[i-1][j-1]=0;   search(i-1,j-1,0);   num++;  }  if(i!=0&&man[i-1][j]){   man[i-1][j]=0;   search(i-1,j,0);   num++;  }  if(i!=0&&man[i-1][j+1]){   man[i-1][j+1]=0;   search(i-1,j+1,0);   num++;  }  if(j!=0&&man[i][j-1]){   man[i][j-1]=0;   search(i,j-1,0);   num++;  }  if(man[i][j+1]){   man[i][j+1]=0;   search(i,j+1,0);   num++;  }  if(j!=0&&man[i+1][j-1]){   man[i+1][j-1]=0;   search(i+1,j-1,0);   num++;  }  if(man[i+1][j]){   man[i+1][j]=0;   search(i+1,j,0);   num++;  }  if(man[i+1][j+1]){   man[i+1][j+1]=0;   search(i+1,j+1,0);   num++;  }  if(1 == flag){   sum++;   if(maxnum<num)    maxnum=num;  } } int main(){  scanf("%d,%d",&m,&n);   for(int i=0;i<m; i++)  {   for(int j=0;j<n;j++){    if(0==j)     scanf("%d",&man[i][j]);    else     scanf(",%d",&man[i][j]);   }  }  sum=0;  for(int i=0;i<m; i++)  {   for(int j=0;j<n;j++){    if(1 == man[i][j]){     search(i,j,1);    }   }  }  printf("%d,%d",sum,maxnum);  return 0; }
点赞 回复
分享
发布于 2018-08-12 12:08
#include <cstdio> #include <iostream> #include <vector> #include <queue> #include <map> #include <numeric> using namespace std; typedef unsigned int ll; int main() {     int N;     while (cin >> N)     {         vector<int> x(N), y(N);     for (int i = 0; i < N; ++i)         cin >> x[i] >> y[i];     int sumx = accumulate(x.begin(), x.end(), 0);     int sumy = accumulate(y.begin(), y.end(), 0); //    cout << sumx << endl;     int INF = -sumy * 4;     vector<vector<int>> f(2, vector<int>(2 * sumx + 1, INF));     int pre = 0, cur = 1;     f[cur][sumx] = 0;     for (int i = 0; i < x.size(); ++i)     {         swap(pre, cur);         for (int j = 0; j < f[cur].size(); ++j)             f[cur][j] = f[pre][j];         for (int j = 0; j < f[0].size(); ++j)         {             if (j - x[i] >= 0) f[cur][j - x[i]] = max(f[cur][j - x[i]], f[pre][j] + y[i]);             if (j + x[i] < f[0].size()) f[cur][j + x[i]] = max(f[cur][j + x[i]], f[pre][j] + y[i]);         }     }     cout << f[cur][sumx] << endl;     } } 第三题题解。 思路:动态规划,f[i][j]表示 考虑前i张卡片,a与b的个人得分之差为j时能得到的最大团体分。
点赞 回复
分享
发布于 2018-08-12 12:14
饿了么
校招火热招聘中
官网直投
嘿抽我抽我 Node第二题题解 https://www.nowcoder.com/discuss/93193
点赞 回复
分享
发布于 2018-08-12 12:08
第五题跟这个有点像,《不重叠线段》 https://blog.csdn.net/greenary/article/details/79416962 但是我好想排序排反了,用贪心解答,应该按终点为第一关键字,我把起点当做第一关键字了。
点赞 回复
分享
发布于 2018-08-12 12:13
https://www.nowcoder.com/discuss/93200
点赞 回复
分享
发布于 2018-08-12 12:15
def if_has_next(arr, i, j, curr):     arr[i][j] = 0     next = []     left = max(j-1, 0)     right = min(j+1, N-1)     top = max(i-1, 0)     down = min(i+1, M-1)     for row in range(top, down+1):         for col in range(left, right+1):             if arr[row][col] == 1:                 arr[row][col] = 0                 next.append([row, col])     if next:         for loc in next:             curr += 1             curr = if_has_next(arr, loc[0], loc[1], curr)     return curr if __name__ == "__main__":     M, N = tuple(map(int, input().split(',')))     arr = [list(map(int, input().split(','))) for _ in range(M)]     P = 0     Q = 0     for i in range(M):         for j in range(N):             curr_q = 0             if arr[i][j] == 0:                 continue             else:                 P += 1                 curr_q += 1                 curr_q = if_has_next(arr, i, j, curr_q)                 # print('{}{},{}'.format(i,j,curr_q))                 Q = max(Q, curr_q)     print("{},{}".format(P, Q)) 仅有的一道ac...献丑了,大神轻喷。。 大概思路就是dfs,一直搜索下去看是否有临近的观众 需要注意的点就是搜过的位置要将“1”改成“0” 边界处理是个头疼的事,debug了好久。。(毕竟渣)
点赞 回复
分享
发布于 2018-08-12 12:16
第一题,循环BFS。https://paste.ubuntu.com/p/J5y2nV75NH/ 第二题,先排序然后慢慢合并吧。https://paste.ubuntu.com/p/QXHp8BdZRs/ 第三题,暴力10% 第四题,暴力70%。https://paste.ubuntu.com/p/KbcJxcDK9B/ 第五题,前面说了,跟不重叠线段有点像,贪心。按线段终点为第一关键字、起点为第二关键字进行排序。我第一、二关键字弄反了。过了44.44%。不知道如果改过来能有多少。
点赞 回复
分享
发布于 2018-08-12 12:17
第五题,贪心加滑动窗口 package contest; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.Scanner; public class BTDC5 {     static class Node implements Comparable<Node>{         int start;         int end;         @Override         public int compareTo(Node o) {             if(this.end<o.end){                 return -1;             }else if(this.end>o.end){                 return 1;             }else{                 if(this.start>o.start){                     return -1;                 }else if(this.start<o.start){                     return 1;                 }             }             return 0;         }     }     public static void main(String[] args) {         Scanner in = new Scanner(System.in);         int n=in.nextInt();         int m=in.nextInt();         ArrayList<Node>list=new ArrayList<>();         for(int i=0;i<n;i++){             Node node=new Node();             node.start=in.nextInt();             node.end=in.nextInt();             if(node.start>node.end){                 node.end+=m;             }             list.add(node);         }         Collections.sort(list);         int res=0,sum=0;         int left=-1,right=-1;         int index=0;         LinkedList<Node>queue=new LinkedList<>();         for(int i=0;i<list.size();i++){             Node node=list.get(i);             if(left==-1&&right==-1){                 left=node.start;                 right=node.end;                 sum++;                 queue.add(node);             }else if(node.start<right){                 continue;             }else if(node.start>=right){                 right=node.end;                 sum++;                 queue.add(node);                 while(right-left>m){                     queue.poll();                     sum--;                     if(!queue.isEmpty()){                         left=queue.peek().start;                     }                 }             }             res=sum>res?sum:res;         }         System.out.println(res);     } }
点赞 回复
分享
发布于 2018-08-12 12:23
812惨案
点赞 回复
分享
发布于 2018-08-12 12:32
我的题解发布链接: https://www.nowcoder.com/discuss/93267,请选我吧
点赞 回复
分享
发布于 2018-08-12 14:51
劝退题
点赞 回复
分享
发布于 2018-08-12 20:50
只会做眼熟的 第一题跟左神视频哈希表那节课岛问题有点类似。 就是数有几个聚在一起的1,用左神的感染函数稍作修改即可。具体是调整输入输出以及加四个斜对角相邻的递归即可。 其他都不会。。。。太渣了、、、 主要java代码如下:     public static int countIslands(int[][] m) {         if (m == null || m[0] == null) {             return 0;         }         int N = m.length;         int M = m[0].length;         int res = 0;         for (int i = 0; i < N; i++) {             for (int j = 0; j < M; j++) {                 if (m[i][j] == 1) {                     res++;                     infect(m, i, j, N, M);                 }             }         }         return res;     }     public static void infect(int[][] m, int i, int j, int N, int M) {         if (i < 0 || i >= N || j < 0 || j >= M || m[i][j] != 1) {             return;         }         m[i][j] = 2;         infect(m, i + 1, j, N, M);         infect(m, i - 1, j, N, M);         infect(m, i, j + 1, N, M);         infect(m, i, j - 1, N, M);         infect(m, i + 1, j+1, N, M);         infect(m, i - 1, j-1, N, M);         infect(m, i-1, j + 1, N, M);         infect(m, i+1, j - 1, N, M);     }
点赞 回复
分享
发布于 2018-08-13 00:01

相关推荐

点赞 18 评论
分享
牛客网
牛客企业服务