百度实习面经2022-4-24(第一次面试,暂时只面了一场,感觉人无了)_百度实习面试-程序员宅基地

技术标签: 面试  java  百度  android  随谈  

我的学习进度

我走的是JavaEE企业版的开发,目前大三在读,路线也是先学的 c语言、java、HTML+CSS3、Jquery、python等 之后专注于 java 走后端开发路线学了MySQL、JavaWeb、SSM、目前学校还在教Springboot

但我感觉进度太慢了,自学了Springboot、Git、MP、SpringCloud(在学)、Linux(再学)、dubbo+zookeeper等一些知识点,然后把JavaSE、MySQL复习了一遍、目前还在复习Java多线程的知识点

笔试过程

为什么给大家说我学的路线和进度呢 ,因为我做笔试的时候就发现了一个很大的问题,我选错职位了,只看见了招Java的就去了,报的是移动开发(Android或者IOS),做题那叫一个懵逼啊,还好有java基础题、数据结构设计、计算机网络、操作系统等题还看得懂,但还是懵逼的很,还有三道算法,做了两个小时,也不知道做了啥,交上去就感觉无了,但就这样神奇的通过了笔试,虽然我不知道是怎么过的,但大家千万不要妄自菲薄,虽然自己不咋地,但同届的又有多强呢,有职位就投,但还是得看看自己对口的是什么,不然过了笔试,面试也会懵逼。

面试通知下达

这里我说一下,百度发面试通知的时候,会有个链接,点进去后选择自己希望面试的时间,这里大家尽力早的选择,我因为想跟辅导员了解一下面试过程就点晚了,提示我当前面试页面显示的这些时间段人满了(链接里没有任何hr的联系方式),这就搞得我更懵逼了,给面试机会不让面试,这不是耍猴吗,但当时时间还早,距离面试还有两天,我当晚去笔试了另一家银行后,在进入页面,就有其他的时间段了,所以遇事不要慌,是等等党的胜利(但工作这事你不上,别人就上了,我特指没办法的是,不要让慌张让你紊乱,该干啥干啥)

面经(牛客网上面试)

我约的四点的面试,三点半我想试试可以联线吗,一点排队,面试官秒接,然后面试就开始了,面试官一上来找我要了一份简历,看了之后说,你学的与我们招的不对口还需要继续吗?(虽然面试官态度真的很好,但对我是暴击),所以投简历的时候一点要看职位与专业对不对口,我就硬着头皮说“我可以学,可以继续面试吗”(我也不想错过这第一次面试的机会),面试官会根据你的情况出题,所以没有问我关于Android相关的问题

一、做自我介绍

我介绍了我自己和做项目的经历(这里可以挖些坑,比如你用了什么方法,不细讲,如果运气好,下一个问题或许会问,这样你可以根据自己学的高谈阔论)

二、根据自我介绍的问题问项目经历

自己挖的坑自己填,然后不要弄些假项目,不然不好说

三、由于我做了微信小程序(问了一下小程序相关的知识点)

这个跟java无关,就略了

四、用过多线程吗?怎么保证线程安全?是怎么实现的加锁?

用过:我用过...

线程安全:

(1) 竞争与原子操作

多线程同时访问和修改同一个数据时,可能存在风险,数据不能保证我们得到的预期数据,解决的办法,我们可以采用原理类,比如JAVA 本身提供了很多的原子类,AtomicInteger ,AtomicLong 等常见的基本数据类型的原子包装类定义,实现数据安全。

(2) 同步与锁

多线程中我们定于的数据,使用Lock去保证数据操作的过程中只有一个线程进入,这个线程拿到锁后,其他线程都不能拿到该锁,进而保证数据的可靠性。

(3) 可重入

一个函数被重入,表示这个函数没有执行完成,但由于外部因素或内部因素,又一次进入该函数执行。例如单片机、处理器的中断会出现重入现象。

参考文章:函数可重入性(Reentrancy)概念详解_Smith先生的博客-程序员宅基地_可重入性

(4) 过度优化

即使使用了合理使用锁,也不一定保证了线程安全,因此需要进行代码的二次优化,使用volatile关键字试图阻止过度优化,它可以做两件事:第一,阻止编译器为了提高速度将一个变量缓存到寄存器而不写回;第二,阻止编译器调整操作volatile变量的指令顺序。

参考文章:确保线程安全的几种方法_周兆熊的博客-程序员宅基地_确保线程安全的几种方法

java 加锁的三种方式:

1、synchronized方式(重量级锁)

加锁方式:synchronized(object)传入对象,不同对象代表不同锁,可以在线程外部新建对象。

2、Lock(比synchronized要轻量级)

  • 新建锁对象Lock l = new ReentrantLock();
  • 加锁 l.lock()
  • 解锁 l.unlock()

3、wait() notify() notifyAll()

wait() notify() notifyAll() 是Object上的方法,只有Object是对象监视器时候才能调用此方法

  •  notify() 唤醒同一个对象监视器上的线程
  • wait(Long timeout) 传入数值,表示超过某个时间还没有被唤醒则自动唤醒
  • wait和sleep区别:
    •  sleep() 可以在同步中和同步外使用,线程遇到sleep不释放锁,时间到了继续向下执行
    •  w ait() 只能在同步中使用,由对象监视器调用, 线程进入wait状态时释放掉 

五、我在简历中写了熟悉MVC和MVVM模式,谈谈我的理解

所以简历里信息的一定真实

MVC:

MVC(Model View Controller)是软件工程中的一种软件架构模式,它把软件系统分为模型视图控制器三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

M:Model,模型。 JavaBean

  • 完成具体的业务操作,如:查询数据库,封装对象

V:view视图。JSP、HTML等来进行数据展示

C:Controller控制器。 Servlet

  • 获取View的请求

  • 调用模型将数据交给视图进行展示

控制器Controller 的作用就是将Model 与 View一一对应起来

我们用用户登录这个例子来说明:

View层是 index.jsp,Cotroller是 /loginServlet,Model是 JavaBean(pojo) 对象

  1. 用户看到的是JSP展示页面,用户输入数据点击登录按钮时,这是JSP会通过数据共享将请求转发到/loginServlet控制器上

  2. 然后控制器再将请求分发到Model上,通过JDBC连接到数据库来查询数据库中是否存在该用户信息。

  3. 若存在该用户,则返回信息,让控制器告诉前台页面展示登陆成功的信息;不存在则告诉登陆失败…

  4. View来响应控制器交给它的数据

在这个过程中,控制器其实只是起到了承上启下的作用,它只负责中转(指挥调度),不负责具体的业务操作。

MVVM:

MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版,整体和mvc差不多,最大的区别就是mvc是单向的,而mvvm是双向的,并且是自动的,也就是数据发生变化自动同步视图,视图发生变化自动同步数据,同时解决了 mvc 中大量的 DOM 操作使页面渲染性能降低,加载速度变慢,影响用户体验。和当 Model 频繁发生变化,开发者需要主动更新到 View

一句话总结:vm层(视图模型层)通过接口从后台m层(model层)请求数据,vm层继而和v(view层)实现数据的双向绑定。

六、做题

题一:反转链表

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiR6K6k5LiN5Yiw5L2g,size_20,color_FFFFFF,t_70,g_se,x_16 

解一:使用栈解决

import java.util.Stack;
public class Solution {
public ListNode ReverseList(ListNode head) {
    Stack<ListNode> stack= new Stack<>();
    //把链表节点全部摘掉放到栈中
    while (head != null) {
        stack.push(head);
        head = head.next;
    }
    if (stack.isEmpty())
        return null;
    ListNode node = stack.pop();
    ListNode dummy = node;
    //栈中的结点全部出栈,然后重新连成一个新的链表
    while (!stack.isEmpty()) {
        ListNode tempNode = stack.pop();
        node.next = tempNode;
        node = node.next;
    }
    //最后一个结点就是反转前的头结点,一定要让他的next
    //等于空,否则会构成环
    node.next = null;
    return dummy;
}
}

解二:双链表求解

public ListNode ReverseList(ListNode head) {
    //新链表
    ListNode newHead = null;
    while (head != null) {
        //先保存访问的节点的下一个节点,保存起来
        //留着下一步访问的
        ListNode temp = head.next;
        //每次访问的原链表节点都会成为新链表的头结点,
        //其实就是把新链表挂到访问的原链表节点的
        //后面就行了
        head.next = newHead;
        //更新新链表
        newHead = head;
        //重新赋值,继续访问
        head = temp;
    }
    //返回新链表
    return newHead;
}

题二:求二叉树的层序遍历

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiR6K6k5LiN5Yiw5L2g,size_20,color_FFFFFF,t_70,g_se,x_16 

解一:递归(前序遍历)

/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型vector<vector<>>
     */
    //前序遍历模板;
    void f(TreeNode* root,int level,vector<vector<int>> &res){
        if(!root)return ;
        if(level>=res.size()){//最新的深度,申请一个数组存储;
            res.push_back(vector<int> {});
        }
        res[level].push_back(root->val);
        f(root->left,level+1,res);//遍历左子树;
        f(root->right,level+1,res);//遍历右子树;
    }

    vector<vector<int> > levelOrder(TreeNode* root) {
        // write code here
        vector<vector<int>> res;//存储最终结果;
        f(root,0,res);//前序遍历;
        return res;//返回结果;
    }
};

 解二:BFS(迭代)

/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > levelOrder(TreeNode* root) {
        // write code here
        vector<vector<int> > vv;
        if(!root){
            return vv;//二叉树为空
        }
        queue<TreeNode*> qq;//队列存放相邻两层节点;
        qq.push(root);
        while(!qq.empty()){
            vector<int> tempv;
            int size=qq.size();
            for(int i=0;i<size;++i){//将一层的节点size出队;
                TreeNode* tt=qq.front();
                qq.pop();
                tempv.push_back(tt->val);
                //将下一层的节点入队;
                if(tt->left)qq.push(tt->left);
                if(tt->right)qq.push(tt->right);
            }
            vv.push_back(tempv);//加入将要返回的数组中;
        }
        return vv;//返回最终结果
    }
};

这就是百度面试经过,别问我为什么算法题怎么清晰,TM的这是牛客网的原题,晚上我参加腾讯的笔试(五道算法)时在牛客网刷到了!!!!!!所以去看刷题(算法不能少)吧,基础绝对不能落下

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_57581439/article/details/124412738

智能推荐

大话西游2人数最多服务器,大话西游2最早的服务器如今去了哪里?老玩家值得了解...-程序员宅基地

文章浏览阅读611次。很多老玩家都知道,《大话西游2》最早的公测时间是2002年,距今已经陪伴玩家们走过了1个年头,而游戏中第一个开放的服务器是哪个?经过十多年不断的合区发展,这个服务器如今又去了哪里?估计很多朋友和小苏一样,都像了解一下详细的情况。这篇文章小苏就和大家一起讨论一下这个话题吧,顺便跟着我的节奏,回顾下曾经的美好岁月~游戏中最初开放的服务器叫“天竺国”,开放时间为2002年6月7号,这算是大话2的开篇之作..._大话2什么时候开区人最多

android开发之解决PopWindow中EditText无法复制粘贴问题_edittext 无法粘贴 pop-程序员宅基地

文章浏览阅读4.5k次。这篇博客主要介绍了Android中解决EditText放到popupWindow中,原有复制、粘贴、全选、选择功能失效问题 的相关资料.由于项目中用到了PopWindow中嵌套Edittext,而Edittext无法进行文字的复制粘贴.于是找到了如下解决方法:使用DialogFragment来创建Dialog.使用方式如下:1.创建你的PopWindow布局文件2.创建Di_edittext 无法粘贴 pop

React_antd_Comment(评论)_typescript_antd+comment没有了-程序员宅基地

文章浏览阅读1.1k次。嵌套评论index.tsximport React, { Component } from 'react';import { Comment, Avatar } from 'antd';interface ICode { children?: any onClickComment: any}const ExampleComment: React.FC<ICode> = (code) => { const { children, onClickComment _antd+comment没有了

Win10下go+grpc+protobuf环境搭建_protoc-gen-go-grpc.exe-程序员宅基地

文章浏览阅读1.4k次。1、_protoc-gen-go-grpc.exe

TypeError: data type not understood_typeerror: data type 'uint-8' not understood-程序员宅基地

文章浏览阅读1.2w次。python的二维数据表示要用二层括号来进行表示。如:产生一个2×3的全0矩阵,若是zeros(2,3)这种写法就会出现 TypeError: data type not understood 这种错误; 正确的写法是 zeros((2,3))..._typeerror: data type 'uint-8' not understood

机器学习/数据挖掘之中国大牛_机器学习数据空间 知乎-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏3次。推荐几个机器学习和数据挖掘领域相关的中国大牛:李航:http://research.microsoft.com/en-us/people/hangli/,是MSRA Web Search and Mining Group高级研究员和主管,主要研究领域是信息检索,自然语言处理和统计学习。近年来,主要与人合作使用机器学习方法对信息检索中排序,相关性等问题的研究。曾在人大听过一场他的讲座,对实际应用_机器学习数据空间 知乎

随便推点

JIRA配置手册 (2):工作流-程序员宅基地

文章浏览阅读1.1w次,点赞4次,收藏40次。作者:Misha 来源:原力注入系列上篇:JIRA配置手册 (1):问题类型管理在项目管理中Jira占据着大佬的地位,很大部分原因要归功于他强大的工作流支持,你可以完全根..._jira workflow颜色

opencv动态地址方式操作像素-at操作-程序员宅基地

文章浏览阅读519次。#include#include#includeusing namespace std;using namespace cv;void colorReduce(const Mat &srcImage, Mat &dstImage, int div);int main(){ Mat srcImage = imread("G:\\group.jpg"); Mat dstIma_opencv动态地址

STM32+AIR800关于温湿度采集上传阿里云以及进行云端下发指令简单的控制_基于stm32温湿度上传云平台-程序员宅基地

文章浏览阅读8.7k次,点赞6次,收藏105次。一、主要功能实现:1、STM32采集温湿度上传至阿里云,进行云端显示2、云端下发指令控制STM32的LED亮灭(直接控制STM32(A)的LED亮灭,以及设置定时时间自动打开和关闭LED)3、云端下发指令通过NRF24L01间接控制第二个STM32(B)的LED亮灭二、 各模块功能划分:1、阿里云物联网云平台:(1)进行云端显示温湿度,给云下设备下达指令2、AIR800:(1)成功..._基于stm32温湿度上传云平台

QT c++ 中使用PostMessage/SendMessage_qt sendmessage-程序员宅基地

文章浏览阅读2.6w次,点赞3次,收藏39次。 PostMessage是Windows API(应用程序接口) 中的一个常用函数,用于将一条消息放入到消息队列中。并且不会等待响应的线程处理消息,而是直接返回。(简单的理解就是异步)。而SendMessage作用一样,但是会等待结果返回(同步)我们先来看PostMessage函数的原型:BOOL WINAPI PostMessage(HWND hWnd, UINT Msg, W..._qt sendmessage

初始对准及组合导航技术_双位置对准-程序员宅基地

文章浏览阅读9.5k次,点赞22次,收藏129次。一、对准是确定坐标系的过程1、初始对准比如说:初始对准就是确定的过程,通过重力加速度和地球自转角速度,其中,天向通过重力加速度确定,水平面的东北向通过地球自转角速度的分量确定。2、坐标系对准比如说,地面车辆中,IMU任意放置,如何确定;可以看出,对准就是确定坐标系的过程。3、矢量定姿<1>双矢量定姿矢量和不共线,因此,、和不共面,其三个矢量构成的矩阵可逆。由于上述矢量构建的姿态矩阵未必满足正交化要求,因此,预先对解算的矢量进行正交及单位化处理。即上述._双位置对准

QT——手动编译qt源代码过程_qt怎么编译-程序员宅基地

文章浏览阅读3.5k次。1.生成解决方案终端进入需要手动编译的项目所在的目录在该目录下执行qmake -project命令,注意qmake前面的路径是qmake的安装路径:/Qt5.11.3/5.11.3/gcc_64/bin/qmake -project该文件夹下会生成.pro文件注意:需要在该文件中添加项目执行过程中需要的模块,笔者的文件中添加了 QT += widgets2.生成Makefile文件..._qt怎么编译

推荐文章

热门文章

相关标签