腾讯暑期实习正式批前端笔试题解

第一题的主要思路就是判断前面的模块有没有建好,所以初始化从最低层模块判断,然后往前找断层,即该模块没有运过来,此时打印left到right的模块,如果left=right,那么打印空格,无法操作
假设有6个模块,初始化right = 6;
第一天运来 3,arr[right] == 0; 此时left = right;无法操作,打印空格
第二天运来 5,arr[right] == 0; 打印空格
第三天运来 6,arr[right] == 1, 找到left = 4, 打印 4 + 1 到 right(6), right变为4
第四天运来 4,同理打印4 3
第五天运来 2,打印2
第六天运来 1,打印1
import java.util.*;
/**
 * @author deng
 * @description
 * @create 2019-04-05 下午4:07
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int len = scanner.nextInt() + 1;
        int arr[] = new int[len];
        int right = len - 1;                // 从最低层开始建设
        StringBuffer s = new StringBuffer();
        for (int i = 0; i < len - 1; i++) {
            int n = scanner.nextInt();
            arr[n] = 1;
            int left = getLeftBoundry(arr, right); // 判断今天运来材料后能建几个模块
            if (left < right) {                    // 可建模块数大于1
                for (int j = left; j < right; j++) {
                    // 这块我忘了要不要按运来的顺序输出了,如果要的话,还需要一个额外的数组保存顺序,如[6, 1, 5, 2, 4, 3] left = 5, right = 6,就输出6 5
                    // 然后根据遍历该顺序数组并判断值在不在left和right区间,然后就能按运来的顺序打印输出了
                    s.append(String.valueOf(j + 1) + " ");
                }
                s.append("\n");
                right = left;                      // 更新边界
            }else{
                s.append(" \n");
            }
        }
        System.out.print(s);
    }
    public static int getLeftBoundry(int arr[], int right) {
        for (int i = right; i >= 0; i--) {
            if (arr[i] == 0) {
                return i;
            }
        }
        return 0;
    }
}
两组测试用例

  1. 3
    3 1 2
    3

    1 2

  2. 4
    2 4 1 3

    4

    1 2 3
第二题用栈,或者字符串也能解决,原理和用栈差不多。找到一对,替换为空串,直到无法替换时,看 count 的数值确定输赢

import java.util.*;

/**
 * @author deng
 * @description
 * @create 2019-04-05 下午4:07
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Stack<Integer> stack = new Stack<>();
        int size = scanner.nextInt();
        for (int i = 0; i < size; i++) {
            int n = scanner.nextInt();
            int count = 0;            // 计算牛牛是否最后拿
            while (n != 0) {
                if (!stack.isEmpty() && stack.peek() == n % 10) {
                    count++;
                    stack.pop();
                } else {
                    stack.push(n % 10);
                }
                n /= 10;
            }
            if (count % 2 == 1) {    // 其实从这里来看,根本不用关心栈里有没有数据, 只需要判断牛牛是否拿到最后一对数字对
                System.out.print("you are win!\n");
            } else {
                System.out.print("oh no.\n");
            }
            stack.clear();
        }
    }
}
两组测试用例
2
12212
113
oh no.
you are win!

2
12233
112233
oh no.
you are win!

第三题没想出来,题目也没保存,谁存了啊,评论区分享下啊

以上都是个人思考的解法,欢迎交流。
最后吐槽下,牛客体验没leetcode好,我都快被这个编辑器逼疯了,代码粘贴过来就一行...我找了个markdown编辑器转换才拿到格式
#腾讯##笔试题目##前端##题解#
全部评论
第三题:把 1 到 2*n 的数分为相同大小的两组 A 和 B (即长度都是n)。然后按照从小到大排序之后,对于 1 <= i <= n,均满足 abs(A[i] - B[i]) >= K。计算出所有满足条件的分配方案数。 输入:输入两个整数 n (1 <= n <= 50), k (1 <= k <= 10); 输出:输出一个整数 示例: 输入: 2 2 输出: 2 说明: A = {1, 2} B = {3, 4} A = {3, 4} B = {1, 2}
点赞 回复 分享
发布于 2019-04-07 09:47
你们都是用c来答题吗?可以用js吗?但是用这个会不会太慢了呢...
点赞 回复 分享
发布于 2019-04-06 21:36
+1 牛客的这个编辑体验是真的难受
点赞 回复 分享
发布于 2019-04-06 11:27
考试当然不会告诉哪个测试样例没通过啊。。。
点赞 回复 分享
发布于 2019-04-06 10:53
这编辑器...样式错乱
点赞 回复 分享
发布于 2019-04-06 10:48

相关推荐

首先讲三个故事,关于牛客的事件一:2024年,牛客上有一对高学历情侣,求职方向与我当时一致,都是嵌入式方向。他们恰好是我的朋友,专业能力和学历背景都很扎实,也因此拿到了不少优质offer。和很多求职者一样,他们把offer情况整理后发在平台上,本意是记录与交流,但很快引发了争议。有声音指责他们“集邮”“不释放名额”,认为这种展示本身就是一种炫耀。最终讨论失控,当事人删除内容,事件也很快被遗忘。事件二:小红书评论区,一条评价获得了不少共鸣:“感觉牛客就是当年那群做题区毕业了开始找工作还收不住那股味,颇有一种从年级第一掉到年纪第二后抱怨考不上大学的味道”,这条评论被水印里这个同学转发到牛客后,评论...
小型域名服务器:当看到别人比自己强的时候,即便这是对方应得的,很多人会也下意识的歪曲解构对方的意图,来消解自己在这本就不存在的比较中输掉的自信,从而平白制造出很多无谓的争论。比如你会在空余时间来写优质好文,而我回家只会暗区突围,那么我就可以作为键盘侠在这里评论你是不是XXXXXXXX。即便我自己都知道这是假的,但只要这没那么容易证伪,那么当你开始回应的时候,脏水就已经泼出去了,后面可能会有更多的人带着情绪来给我点赞,而毫不关注你写的文章内容本身是啥了。
SAGIMA牛马咖啡
点赞 评论 收藏
分享
评论
点赞
14
分享

创作者周榜

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