面试现场:今日头条(一面已通过)

共 4419字,需浏览 9分钟

 ·

2021-08-05 09:24

Hello World,我是老田。今天给大家分享的是一位朋友去今日头条的面试历程(一位本科大三的科班生,目前在美团实习)。

以下是他的一面历程,一共分为6个环节:

如果你想攀登高峰,切莫把彩虹当作梯子。

1、自我介绍

对自己的情况做了有一个简单的自我介绍后,面试官问了一句对工作的语言有没有要求(因为本人是Java技术栈)。

如何自我介绍,如何写简历,这些都是提前准备好的。千万不要等着临场头脑发热,最好是能背一遍,但是不要面试官觉得你在背。

2、聊项目

面试官:说说你最熟悉的项目,用了哪些技术栈,项目中遇到了什么挑战?

然后,选了一个最近在做的项目,介绍了整个项目使用了哪些技术栈,业务整体是怎么样的,遇到过某某问题,后面通过某某手段解决了。

然后,面试官对项目进行提了一些技术问题,问题如下。

为何需要去中心化?

你觉得微服务的优缺点有哪些?

去中心化的好处?

分布式如何保证一致性?

单点故障,不可用,数据丢失后,如何保证一致性?

为何选择使用RocketMQ?MQ选型

你说小规模项目应用RocketMQ较好,为什么?为什么觉得跟Java技术栈比较契合?

Kafka和RocketMQ的比较?选型讨论了很久,消息的量级和MQ的延迟的关系

MQ如何保证消息不丢失?

MQ如何保证消息的幂等性?不重复消费

多个节点通过MQ发消息如何保证消息的顺序?

问了个向量时钟有了解吗?

简单说说一个java源文件到垃圾回收的整个过程

如何选择垃圾收集器

说说JVM中的栈与线程的关系

熟悉哪些JVM问题排查工具?

3、操作系统

关于操作系统,一共就问了四个问题:

熟悉进程调度策略吗?

说说CFS?

友好度是啥?

如何计算出来的?

4、计算机网络

TCP可靠传输由哪些东西来保证的?

除了三次握手、四次挥手,数据传输过程中如何保证可靠传输?

通信最基本的要求是什么?(大概面试官想提示我,我没太get到)

点对点通信的要求?基本特点?(非常难以get到面试官想问我什么)

后来知道想问TCP的ARQ、滑动窗口、拥塞控制、流量控制、超时重传等等。

5、手写SQL

表1:学生表student(no{学号}, name{名字}) 表2:成绩表grade(no{学号}, grade{成绩}, subject{科目}) 给定一个学生姓名,求该学生的各科的成绩:

这里之前写的时候保留的是no和grade两列,面试官就问为啥要no,后面知道原来他想要把subject也放进结果里。。。

6、算法

单链表反转

输入一个链表,反转链表后,输出新链表的表头。

输入:{1,2,3}

输出:{3,2,1}

这个题有两种解法,请看代码:

//第一种方法是:非递归方法
/*
struct ListNode {
 int val;
 struct ListNode *next;
 ListNode(int x) :
   val(x), next(NULL) {
 }
};*/

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
  
        if(pHead==NULL) return NULL;//注意程序鲁棒性
        
        ListNode* pNode=pHead;//当前指针
        ListNode* pReverseHead=NULL;//新链表的头指针
        ListNode* pPrev=NULL;//当前指针的前一个结点
        
        while(pNode!=NULL){//当前结点不为空时才执行
            ListNode* pNext=pNode->next;//链断开之前一定要保存断开位置后边的结点
            
            if(pNext==NULL)//当pNext为空时,说明当前结点为尾节点
                pReverseHead=pNode;
 
            pNode->next=pPrev;//指针反转
            pPrev=pNode;
            pNode=pNext;
        }
        return pReverseHead;
    }
}

//第二种方法是:递归方法 
/**
struct ListNode {
 int val;
 struct ListNode *next;
 ListNode(int x) :
   val(x), next(NULL) {
 }
};*/

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
  //如果链表为空或者链表中只有一个元素 
        if(pHead==NULL||pHead->next==NULL) return pHead;
        
  //先反转后面的链表,走到链表的末端结点
        ListNode* pReverseNode=ReverseList(pHead->next);
        
        //再将当前节点设置为后面节点的后续节点
        pHead->next->next=pHead;
        pHead->next=NULL;
        
        return pReverseNode;
        
    }
};

递归的方法其实是非常巧的,它利用递归走到链表的末端,然后再更新每一个node的next 值 ,实现链表的反转。而newhead的值没有发生改变,为该链表的最后一个结点,所以,反转后,我们可以得到新链表的head。

注意关于链表问题的常见注意点的思考:

1、如果输入的头结点是NULL,或者整个链表只有一个结点的时候

2、链表断裂的考虑

总结

看完上面的面试,你觉得难吗?

以上题目答案在我的面试小抄里都可以找到,所以,再文章中就没必要再贴答案了

参考

www.nowcoder.com/discuss/687513

— 【 THE END 】—
本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!

最近面试BAT,整理一份面试资料Java面试BATJ通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 PDF 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

浏览 42
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报