3-29 百度 笔试 java后台开发,三道题AC答案

做题的时候写的很匆忙,没有优化,大佬们可以指出(PS: 互联网大厂最后一题经常出图论题目,我最近总是遇到)
题目描述大家可以看16楼
第一题:
由于n和n-1一定互质,所以直接返回  n*(n-1) -1
注意用long保存答案,使用int,乘法运算会溢出(python用户可以窃喜)
import java.util.Scanner;

public class Solution1 {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        long n=s.nextLong();
        System.out.print((n-1)*n-1);
    }
}
第二题:
模拟法,每次选取最大的一项的值为max;更新最大项max=max%N;  其余每项加上 max/N;
一直循环到满足题目要求,数组每项都小于N
import java.util.Scanner;
public class Solution2 {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);

        int N = s.nextInt();
        long[] nums=new long[N];
        long sum=0;
        for (int i = 0; i < N; i++) {
            nums[i]=s.nextLong();

        }

        while(!isValid(nums)){
            long max=0;
            int index=0;
            for (int i = 0; i < nums.length; i++) {
                if(max<nums[i]){
                    max=nums[i];
                    index=i;
                }
            }
            sum+=max/N;
            for (int i = 0; i <N ; i++) {
                nums[i]+=max/N;
            }
            nums[index]=max%N;
        }
        System.out.println(sum);

    }
    public static boolean isValid(long[] nums){
        boolean res=true;
        for(long l:nums){
            if(l>=nums.length){
                res=false;
            }
        }
        return res;
    }
}
第三题:
当做图模型来解题,求图中权值递增的最长路径;根据题意,图中只有N-1条边,且无法从权值大的点走到权值小的点,因此遍历图的时候,并不会出现“往回走”,“死循环”的问题
所以这里可以直接用深度优先遍历
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Solution3 {
    static int max=0;
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        int N=s.nextInt();
        int[] nums=new int[N+1];
        for (int i = 1; i < N+1; i++) {
            nums[i]=s.nextInt();
        }
        List<Integer>[] graph=new ArrayList[N+1];
        for(int i=0;i<graph.length;i++){
            graph[i]=new ArrayList<>();
        }
        for (int i = 0; i <N-1 ; i++) {
            int l=s.nextInt();
            int r=s.nextInt();
            graph[l].add(r);
            graph[r].add(l);
        }
        for (int i = 1; i <N ; i++) {
            dfs(graph,nums,i,0);
        }
        System.out.println(max);



    }
    public static void dfs(List<Integer>[] graph,int[] nums,int now,int len){
        len+=1;
        max=Math.max(max,len);
        List<Integer> nexts=graph[now];
        for (int next:nexts ) {
            if(nums[next]>nums[now]){
                dfs(graph,nums,next,len);
            }
        }
    }
}

找实习/工作不容易,楼主投简历时也很紧张,心态经常起伏,与大家共勉,祝大家都能拿到满意的offer。

#百度笔试##百度##笔试题目#
全部评论
题目1: 输入: n  范围 [2,10 ** 9] 找到两个数a,b; 1 <= a < b <= n:使得a,b的最小公倍数减去a,b的最大公约数的结果res最大 输出:res 题目2: 输入:      第一行:n (数组元素个数) 范围 【2,50】      第二行:n个数 范围 【1,10 ** 18】 每次找到数组中最大的元素,将该元素减去n,其余n - 1个元素均加一; 重复此操作,直至数组中最大的元素小于 n 输出:k (操作次数) 题目三: 输入:         第一行:n(顶点个数) 范围 【2,10 ** 5】         第二行:n个数(表示顶点的权值) 范围 【1,n】         接来下 n - 1 行,每行两个数,代表两个顶点之间存在边 找出一条最长路径(u,v),使得从u 到 v 路径所经过的顶点满足权值严格递增 输出:路径长度
4 回复
分享
发布于 2020-03-30 13:31
第二题一样的思路但是通过率为0。。。
3 回复
分享
发布于 2020-03-30 00:49
联想
校招火热招聘中
官网直投
我的第二题: n = int(input()) data = list(map(int,input().split())) time = [0 for _ in range(n)] arr_max = max(data) k = 0 while arr_max >= n:     op = 0     for i in range(n):         time[i] = data[i] // n         op = op + data[i] // n         data[i] = data[i] - time[i] * n     k = k + op     arr_max = -1     for i in range(n):         data[i] = data[i] + op - time[i]         arr_max = max(arr_max,data[i]) print(k)
2 回复
分享
发布于 2020-03-30 13:21
太强了
1 回复
分享
发布于 2020-03-29 22:12
第三题这样暴力dfs能AC?我是先对权值排序再dfs,标记走过的节点做优化,只过了20% #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef pair<int, int> PII; const int N = 100010, M = N * 2; int h[N], e[M], ne[M], idx; int w[N]; PII node[N]; bool st[N];//标记走过的,以此处为头必不可能为最长路径 int n; int ans = 1; void add(int a, int b) {   e[idx] = b, ne[idx] = h[a], h[a] = idx ++; } void dfs(int u, int s) {   st[u] = true;   ans = max(ans, s);   for (int i = h[u]; ~i; i = ne[i])   {     int j = e[i];     if (!st[j] && w[j] > w[u]) dfs(j, s + 1);   } } int main() {   memset(h, -1, sizeof h);   scanf("%d", &n);   // 记录点权   for (int i = 1; i <= n; i ++)    {     scanf("%d", &w[i]);     node[i] = {w[i], i};   }   // 建图   for (int i = 0; i < n - 1; i ++)   {     int u, v;     scanf("%d%d", &u, &v);     add(u, v), add(v, u);   }   // 给点权排序   sort(node, node + n);   // 遍历树   for (int i = 1; i <= n; i ++)   {     if (!st[node[i].second]) dfs(node[i].second, 1);   }   printf("%d\n", ans);   return 0; }
1 回复
分享
发布于 2020-03-29 22:32
大佬牛批,感谢你的思路。
点赞 回复
分享
发布于 2020-03-29 21:43
感觉所有笔试题第一题都是脑筋急转弯😂
点赞 回复
分享
发布于 2020-03-29 21:48
膜拜大佬!
点赞 回复
分享
发布于 2020-03-29 21:55
第三题用的dfs,直接当图做了,不过傻了吧唧用二维数组保存树结构,最后只过了60%,提示内存超出限制🤣看了楼主的才知道自己错哪儿了
点赞 回复
分享
发布于 2020-03-29 23:32
第一题用n×(n-1)-1结果只过了30%,我一度以为自己想法错了,改成o(n∧2)的,还是只过了30%。第二题被最少多少次迷惑,以为有什么dp,还在想每次不取最大的-n,还能取谁?居然是要模拟,感觉自己好**,凉凉😭
点赞 回复
分享
发布于 2020-03-29 23:37
能分享下题目不
点赞 回复
分享
发布于 2020-03-30 00:46
感谢大佬 😆
点赞 回复
分享
发布于 2020-03-30 10:05
666,第2题自己写了大顶堆来做,超时😂😅
点赞 回复
分享
发布于 2020-03-30 10:21
大佬能否解释一下第二题的思路
点赞 回复
分享
发布于 2020-03-30 10:46
tql
点赞 回复
分享
发布于 2020-03-30 12:17
膜大佬~
点赞 回复
分享
发布于 2020-03-30 15:52
请问题目大概还记得吗?谢谢
点赞 回复
分享
发布于 2020-04-04 14:25
发现百度的笔试整体比阿里的要简单很多啊
点赞 回复
分享
发布于 2020-04-04 15:52

相关推荐

点赞 评论 收藏
转发
25 87 评论
分享
牛客网
牛客企业服务