腾讯后端笔试 除第二题全A思路

求第二题思路

1. 基本leetcode 394原题,没什么好说的
2. 求思路!!!
3. 贪心,按照起始点排序以后,每次遍历起点小于等于当前区间终点,取终点最大的那个。边界条件一个是中间发生不能覆盖的情况,一个是遍历完最后小于所求区间
package tencent.c0817.c;

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int L = scanner.nextInt();
        int[][] guard = new int[n][2];
        for (int i = 0; i < n; i++) {
            guard[i][0] = scanner.nextInt();
            guard[i][1] = scanner.nextInt();
        }

        System.out.println(minGuards(guard, L));
    }

    private static int minGuards(int[][] guard, int len) {
        Arrays.sort(guard, (a, b) -> a[0] - b[0]);
        int end = 0;
        int count = 0;
        int i = 0;

        while (i < guard.length) {
            if (end >= len) {
                break;
            }
            int max = end;
            if (guard[i][0] > end) {
                return -1;
            }
            while (i < guard.length && guard[i][0] <= end) {
                if (guard[i][1] > max) {
                    max = guard[i][1];
                }
                i++;
            }
            end = max;
            count++;
        }
        if (end < len) {
            return -1;
        }
        return count;
    }
}


4. 开向前看向后看两个数组,用栈,每次pop出比当前楼小的,用stack的size作为值,最后输出记得+1(当前楼)
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] heights = new int[n];
        for (int i = 0; i < n; i++) {
            heights[i] = scanner.nextInt();
        }

        int[] front = new int[n];
        int[] back = new int[n];
        Deque<Integer> stack = new ArrayDeque<>();
        stack.push(heights[0]);
        for (int i = 1; i < n; i++) {
            front[i] = stack.size();
            while (!stack.isEmpty() && stack.peek() <= heights[i]) {
                stack.pop();
            }
            stack.push(heights[i]);
        }
        stack.clear();
        stack.push(heights[n - 1]);
        for (int i = n - 2; i >= 0; i--) {
            back[i] = stack.size();
            while (!stack.isEmpty() && stack.peek() <= heights[i]) {
                stack.pop();
            }
            stack.push(heights[i]);
        }
        for (int i = 0; i < n; i++) {
            System.out.print(front[i] + back[i] + 1);
            System.out.print(" ");
        }

    }


}


5. dp,直接看代码吧……
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] company = new int[n];
        int[] gym = new int[n];
        for (int i = 0; i < n; i++) {
            company[i] = scanner.nextInt();
        }
        for (int i = 0; i < n; i++) {
            gym[i] = scanner.nextInt();
        }
        System.out.println(helper(company, gym));
    }

    private static int helper(int[] company, int[] gym) {
        int n = company.length;
        int[][] dp = new int[n][3];
        if (company[0] == 0) {
            dp[0][0] = 1;
        }
        if (gym[0] == 0) {
            dp[0][1] = 1;
        }
        dp[0][2] = 1;
        for (int i = 1; i < n; i++) {
            int j = i - 1;
            dp[i][0] = Math.min(dp[j][1], dp[j][2]) + (company[i] == 0 ? 1 : 0);
            dp[i][1] = Math.min(dp[j][0], dp[j][2]) + (gym[i] == 0 ? 1 : 0);
            dp[i][2] = Math.min(Math.min(dp[j][0], dp[j][1]), dp[j][2]) + 1;
        }
        return Math.min(Math.min(dp[n - 1][0], dp[n - 1][1]), dp[n - 1][2]);
    }
}


#腾讯##笔试题目#
全部评论
第二题ac代码: #include <bits/stdc++.h> using namespace std; long long f[30], e[30]; int a[1050000]; void divide(int l, int r,int x); int main(){     int n, m;     scanf("%d", &n);     m = pow(2,n);          for (int i=0; i<m; ++i){         scanf("%d", &a[i]);     }          divide(0,m,n);          int t, p;     long long ans;     scanf("%d", &t);     while (t--){         scanf("%d", &p);         for (int i=1; i<=p; ++i)             f[i] = pow(2,i+n-2) - e[i] - f[i];         ans = 0;         for (int i=1; i<=n; ++i){             ans += f[i];         }         cout << ans << endl;     }      } void divide(int l, int r,int x){     if (x==0){         return;     }           int mid = (l+r) / 2;     divide(l,mid,x-1);     divide(mid,r,x-1);          int nowp = mid;     for (int i=l; i<mid; i++){         while (nowp < r && a[nowp] < a[i]) nowp++;         f[x] += (nowp-mid);     }          int i=l, j=mid, ri, rj;     while (i<mid && j<r){         if (a[i] == a[j]){             ri = rj = 1;             while (ri+i < mid && a[ri+i] == a[i]) ri++;             while (rj+j < r && a[rj+j] == a[j]) rj++;             e[x] += ri * rj;             i += ri;             j += rj;             continue;         }         if (a[i] > a[j]) j++;         else i++;     }          vector<int> v;     i=l;      j=mid;     while (i<mid || j<r){         if (i==mid) {             v.push_back(a[j++]);             continue;         }         if (j==r) {             v.push_back(a[i++]);             continue;         }         if (a[i] < a[j])             v.push_back(a[i++]);         else             v.push_back(a[j++]);     }     for (int i=l; i<r; ++i)         a[i] = v[i-l];          }
点赞 回复 分享
发布于 2019-08-17 22:20
巨佬
点赞 回复 分享
发布于 2019-08-17 23:21
表示第二题debug 40min
点赞 回复 分享
发布于 2019-08-17 22:25
是冰淇淋那套题吗?
点赞 回复 分享
发布于 2019-08-17 22:19
3没懂呀,是贪心结合dp的意思吗?求代码😂
点赞 回复 分享
发布于 2019-08-17 22:18
为什么我第三题用贪心只AC0.1😭
点赞 回复 分享
发布于 2019-08-17 22:17
神仙
点赞 回复 分享
发布于 2019-08-17 22:14

相关推荐

06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
5
49
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务