面试复盘|8.29~拼多多一面

一面:2021-08-29

  1. 自我介绍-提到开源组织,问我贡献,然而我只是学习者,无贡献,就过了~

  2. 询问擅长的语言:Java、python、C++

  3. 询问Java基础【10min】:Java的八种基本数据类型、装箱和拆箱、何时自动装箱、接口和抽象类的区别、Java多线程是否用过(我说了用过,然后主动说了线程创建的几种方式)、线程和进程的区别、共享资源如何定义、什么是死锁、Java中如何排查死锁(不知道)、如何避免死锁(破坏死锁的四个必要条件)、==和equals的区别、如何排查内存泄漏的问题(不知道)、你平时如何排查代码中的问题(我就说了最近项目中遇到的一个问题和我解决问题的方式)

  4. 手撕一【15min-over】:给定0~n这几个数字,和一个整数k,从0开始,删除第k个数字,循环数数并删除,直到数组只剩下一个数字的时候,输出这个数字。

    既然是数字绕圈的形式,并且每次操作需要删除元素,我的思路就是用循环链表来处理,but我不熟悉Java中双向链表,emmmm,因此我无法用双向链表来构建循环链表。所以就自己定义了链表结构。考试时只能网页敲,并且网页不能运行,以下代码是我复盘在IDE上复现的当时代码,结果是对的:

    class Node {
        int val;
        Node next;
    
        Node(int val, Node next) {
            this.val = val;
            this.next = next;
        }
    
        @Override
        public String toString() {
            return "Node{" +
                    "val=" + val +
                    ", next=" + next +
                    '}';
        }
    }
    
    public class Solution {
        public static void main(String[] args) {
            int n = 6, k = 2;
            // 构建循环链表
            Node head = new Node(0, null);
            Node cur = head;
            for (int i = 1; i < n + 1; i++) {
                cur.next = new Node(i, null);
                cur = cur.next;
            }
            cur.next = head;
            // 删除元素
            cur = head;
            while (cur.next != null) {
                int cnt = 0;
                Node pre = null;
                // 循环k次寻找待删除点
                while (cnt < k && cur.next != null) {
                    pre = cur;
                    cur = cur.next;
                    cnt++;
                }
                // 删除current节点
                if (cur.next != null && cnt == k) {
                    System.out.println("delete:" + cur.val);
                    pre.next = cur.next;
                    cur.next = null;
                    cur = pre;
                }
            }
            System.out.println(cur.val);
        }
    }
    delete:2
    delete:4
    delete:6
    delete:1
    delete:5
    delete:3
    delete:0
    0

    面试官说不用写注释,直接写代码就可以。but,注释其实是给我自己理清思路看的,不是给他看的,emmmm

  5. 手撕二【30min-没写完】:给一个数组nums,顺序不能变;有两个人玩游戏,每一个人可以操作数组,然后会得到自己相应的分数,最后当数组再也无法操作时,游戏结束,输出两人分数之差。其中数组的操作方式:可以从数组的最左侧或最右侧取一个值(该值作为该玩家本轮的分数),或者可以禁掉最左侧/最右侧两个连续的值(本轮则没有得分)(禁掉或者取走都相当于从数组中删除)。甲乙两个人先后执行一个操作。

    我的思路:

    • 这个涉及到策略问题,甲乙两人相当于都有四种操作方式,每一局需要选择最优的策略,使得最后的总分更高一些。
    • 用left、right标记数组当前左右操作的位置
      • 当数组没有剩余数字时,游戏结束,即left>right;
      • 当数组只剩下一个数字时,没必要禁掉,即right-left==0;
      • dfs暴力搜索
#面试复盘##拼多多##java工程师##面经#
全部评论
我之前面百度手撕代码写了个注释被面试官怼,说是怕他看不懂吗😑😑😑
点赞 回复 分享
发布于 2021-09-01 14:12
请问一下您是8.22写的笔试吗
点赞 回复 分享
发布于 2021-08-31 21:57
第一题好像是约瑟夫环
点赞 回复 分享
发布于 2021-08-29 20:47

相关推荐

01-03 10:04
已编辑
北京大学 算法工程师
北科勒布朗詹姆斯:无脑腾,现在户口有鸟用,你又不高考,研究所都是嘴上一套背后一套的,招人的时候说是37w955,真去了可由不得你
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
评论
2
10
分享

创作者周榜

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