建网站 企汇网,名词解释 网站规划,现在进入西安最新通知,wordpress商城系统作者保证#xff0c;本系列全是纯干货真实记录#xff0c;绝对不是某些营销号瞎编乱造的面试。 一、公司的简介
百度是全球最大的中文搜索引擎#xff0c;是中国最大的以信息和知识为核心的互联网综合服务公司#xff0c;更是全球领先的人工智能平台型公司。2000年1月1日创… 作者保证本系列全是纯干货真实记录绝对不是某些营销号瞎编乱造的面试。 一、公司的简介
百度是全球最大的中文搜索引擎是中国最大的以信息和知识为核心的互联网综合服务公司更是全球领先的人工智能平台型公司。2000年1月1日创立于中关村公司创始人李彦宏拥有“超链分析”技术专利也使中国成为美国、俄罗斯、和韩国之外全球仅有的4个拥有搜索引擎核心技术的国家之一。
百度作为全球最大的中文搜索引擎百度每天响应来自100余个国家和地区的数十亿次搜索请求是网民获取中文信息的最主要入口。百度以“用科技让复杂的世界更简单”为使命不断坚持技术创新致力于“成为最懂用户并能帮助人们成长的全球顶级高科技公司”。
百度是中国最大的以信息和知识为核心的互联网综合服务公司。在AI驱动下百度的移动生态是中国最大的以信息和知识为核心的移动生态以百家号、智能小程序和托管页为主要支柱。2019年百度用户规模突破10亿。百度App日活跃用户2.22亿信息流位居中国第一。百家号创作者达到300万。百度智能小程序是国内唯一完全开源的小程序平台月活用户规模破3.54亿。百度知道、百度百科、百度文库等六大知识类产品累计生产超10亿条高质量内容构建了中国最大的知识内容体系。
百度是全球领先的人工智能平台型公司。百度大脑是中国唯一的“软硬一体AI大生产平台”是百度AI的集大成对外全方位输出超过250多项AI能力。飞桨是中国首个全面开源开放、功能完备的产业级深度学习平台是中国自主研发的“智能时代的操作系统”。百度智能云是百度AI To B业务的重要承载者和输出者是产业智能化领导者。小度助手是中国最大的对话式人工智能操作系统拥有中国市场规模最大、最繁荣的对话式人工智能生态2020年3月小度助手语音交互次数超过65亿次。作为全球最大自动驾驶开放平台Apollo代表中国最强自动驾驶实力被知名研究公司Navigant Research列为全球四大自动驾驶领域领导者之一。目前已形成自动驾驶、车路协同、智能车联三大开放平台。自动驾驶方面超过十项中国第一技术实力领跑行业。智能交通方面百度“ACE交通引擎”是全球首个车路行融合的全栈式智能交通解决方案。 废话少说BATTMD哪个公司不是吹的天花乱坠直接看工资
校招
SP代表special offer
SSP的offer级别还在SP之上
一般情况下薪资专栏中的18*15
是指1.8w一个月一年总共15个月
其中15一般是13个月工资包括2个月的年终奖
简单科普结束以后我们来看看数据吧 这是硕士的薪资本科的自行减去1-2k测试岗也是从研发减去1-2k。
社招 薪资方面呢在BATTMD中不算很有竞争力但是今年还是涨了不少算是很有诚意适合喜欢所谓“技术”以及没有更好选择的同学去。
二、对公司的评价
产品之神俞军在移动互联网前夕走了百度在10-20掉队了这是不可否认的事实。但是最近两年百度一直在改变押宝在无人车上。去年股票也确实表现不错暂时可以坚持下去。
市值1145亿美元比去年翻了不止一倍之前还以为他凉凉了
三、面试过程
1如何判断链表是否有环
像模像样的要我现场写了一遍说了一遍思路。
为了表示给定链表中的环我们使用整数 pos 来表示链表尾连接到链表中的位置索引从 0 开始。 如果 pos 是 -1则在该链表中没有环。
示例 1
输入head [3,2,0,-4], pos 1 输出true 解释链表中有一个环其尾部连接到第二个节点。 示例 2
输入head [1], pos -1 输出false 解释链表中没有环。 进阶
你能用 O(1)即常量内存解决此问题吗 思路首先我们要明白链表不可能出现这种情况 因为一个结点只有一个指针所以链表只可能向实例一那样在末尾出现一个环。
慢指针一次一步快指针一次两步。能相遇就是有环反之没有环。就像操场跑步跑的快的总有一天可以追慢的一圈相遇。
/*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/
public class Solution {public boolean hasCycle(ListNode head) {if (head null || head.next null) {return false;}ListNode slow head;ListNode fast head.next;while (slow ! fast) {if (fast null || fast.next null) {return false;}slow slow.next;fast fast.next.next;}return true;}
}
那么这对于懂算法的人来说可能是烂大街的问题有些人可能不屑于看了那么第二个问题来了如果让那个快指针一次走三步还能不能做正确的答案呢一次四步呢五步呢
如果看的人多我会在下一期公布答案哈哈大家不要以为应试被题就可以过关。
2介绍一下堆这种数据结构
大根堆要求
①根节点的关键字既大于或等于左子树的关键字值又大于或等于右子树的关键字值。
②为完全二叉树。
注意这是递归定义的。
对于大根小根堆递归定义实现空间复杂度各种操作的时间复杂度真实写二叉树的情况和数组模拟的情况都要会。
有人要问了会这些算法有啥用其实Java的优先队列就是堆结构。八大排序之一的堆排序也是数组上堆结构面试官让我手动实现一个以下是实现。
/*功能:堆排序
输入:数组名称(也就是数组首地址)、数组中元素个数
注画画*/
/*
功能:建堆
输入:数组名称(也就是数组首地址)、参与建堆元素的个数、从第几个元素开始
*/
void sift(int *x, int n, int s)
{int t, k, j;t *(xs); /*暂存开始元素*/k s; /*开始元素下标*/j 2*k 1; /*左子树元素下标*/while (jn){if (jn-1 *(xj) *(xj1))/*判断是否存在右孩子并且右孩子比左孩子大成立就把j换为右孩子*/{j;}if (t*(xj)) /*调整*/{*(xk) *(xj);k j; /*调整后,开始元素也随之调整*/j 2*k 1;}else /*没有需要调整了,已经是个堆了,退出循环。*/{break;}}*(xk) t; /*开始元素放到它正确位置*/
}
/*
功能:堆排序
输入:数组名称(也就是数组首地址)、数组中元素个数
注** ** - * ** * *
建堆时从从后往前第一个非叶子节点开始调整也就是“-”符号的位置
*/
void heap_sort(int *x, int n)
{int i, k, t;
//int *p;for (in/2-1; i0; i--){sift(x,n,i); /*初始建堆*/}for (kn-1; k1; k--){t *(x0); /*堆顶放到最后*/*(x0) *(xk);*(xk) t;sift(x,k,0); /*剩下的数再建堆*/}
}3排序知道哪些来介绍介绍
答全知道全会写然后只说了冒泡的所有思路和优化、和快排BFPRT就被叫停了。我就把所有排序介绍和实现分享给大家。
全排序 一面结束面试小哥表示对我很满意说马上让另外一个人二面。 二面
二面小哥说一面说你算法贼强咱们这次就不聊算法了说说项目。
4)看我项目里用了redis就问redis都有哪些数据结构。
我说有string、list、hash、set、zset。
问你说的这些Java以及其他语言基本也都有你说了解redis那这些数据结构到底是不是快咋实现的呢
我举例子说了一下
1 字符串
redis并未使用传统的c语言字符串表示它自己构建了一种简单的动态字符串抽象类型。
当需要一个可以被修改的字符串时redis就会使用自己实现的SDSsimple dynamic string。比如在redis数据库里包含字符串的键值对底层都是SDS实现的不止如此SDS还被用作缓冲区buffer比如AOF模块中的AOF缓冲区以及客户端状态中的输入缓冲区。
下面来具体看一下sds的实现 struct sdshdr { int len;//buf已使用字节数量保存的字符串长度 int free;//未使用的字节数量 char buf[];//用来保存字符串的字节数组 };
sds遵循c中字符串以\0结尾的惯例这一字节的空间不算在len之内。
这样的好处是我们可以直接重用c中的一部分函数。比如printf sds相对c的改进 获取长度c字符串并不记录自身长度所以获取长度只能遍历一遍字符串redis直接读取len即可。 缓冲区安全c字符串容易造成缓冲区溢出比如程序员没有分配足够的空间就执行拼接操作。而redis会先检查sds的空间是否满足所需要求如果不满足会自动扩充。 内存分配由于c不记录字符串长度对于包含了n个字符的字符串底层总是一个长度n1的数组每一次长度变化总是要对这个数组进行一次内存重新分配的操作。因为内存分配涉及复杂算法并且可能需要执行系统调用所以它通常是比较耗时的操作。 redis内存分配
1、空间预分配如果修改后大小小于1MB程序分配和len大小一样的未使用空间如果修改后大于1MB程序分配 1MB的未使用空间。修改长度时检查够的话就直接使用未使用空间不用再分配。
2、惰性空间释放字符串缩短时不需要释放空间用free记录即可留作以后使用。 二进制安全
c字符串除了末尾外不能包含空字符否则程序读到空字符会误以为是结尾这就限制了c字符串只能保存文本二进制文件就不能保存了。
而redis字符串都是二进制安全的因为有len来记录长度。 这就是redis中string的实现和要点我大概都给他讲了一遍。然后他说你不用说了又说到算法数据结构了咱们聊点别的。 5聊点实际的吧你一直在吹redis知道用redis会给你带来什么问题吗
我有点懵就给他说nosql和传动数据库的区别之类的然后他说你不要给我说这些比较举个例子缓存雪崩听说过吗我就明白他想聊什么了又给他说了说以下内容。
缓存穿透
一般的缓存系统都是按照key去缓存查询如果不存在对应的value就去后端系统查找比如DB。
一些恶意的请求会故意查询不存在的key,请求量很大就会对后端系统造成很大的压力。这就叫做缓存穿透。 如何避免
1对查询结果为空的情况也进行缓存这样再次访问时缓存层会直接返回空值。缓存时间设置短一点或者该key对应的数据insert了之后清理缓存。
2对一定不存在的key进行过滤。具体请看布隆过滤器
缓存击穿
是针对缓存中没有但数据库有的数据。
场景是当Key失效后假如瞬间突然涌入大量的请求来请求同一个Key这些请求不会命中Redis都会请求到DB导致数据库压力过大甚至扛不住挂掉。
解决办法
1、设置热点Key自动检测热点Key将热点Key的过期时间加大或者设置为永不过期或者设置为逻辑上永不过期
2、加互斥锁。当发现没有命中Redis去查数据库的时候在执行更新缓存的操作上加锁当一个线程访问时其它线程等待这个线程访问过后缓存中的数据会被重建这样其他线程就可以从缓存中取值。
缓存雪崩
是指大量Key同时失效对这些Key的请求又会打到DB上同样会导致数据库压力过大甚至挂掉。
解决办法
1让Key的失效时间分散开可以在统一的失效时间上再加一个随机值或者使用更高级的算法分散失效时间。
2构建多个redis实例个别节点挂了还有别的可以用。
3多级缓存比如增加本地缓存减小redis压力。
4对存储层增加限流措施当请求超出限制提供降级服务一般就是返回错误即可 他说作为一个学生知道这些知识就可以了对我比较满意说让三面。 三面面试官看样子是某个领导问的比较随意。
6输入网址到看到网页的过程
答能多细就多细你背答案估计就死了要理解域名解析 -- TCP3次握手 -- 发http请求 -- 响应http请求浏览器得到html代码 -- 浏览器解析代码请求html代码中的资源js、css、图片等 -- 浏览器对页面进行渲染呈现给用户
7让手写快排我寻思真就没别的可问了呗
然后就结束了。 四、感受
感觉总体难度一般问链表环问题改成三四步我是没想到的证明面试官有点东西。二面面试官给我的感觉应该也读过redis源码我记录的应该不全俩人这方面谈的挺投机。整体是挺好的体验可能因为也是学长内推的关系三次面试都像聊天一样就过去了。手写算法也基本没卡壳平时因为很重视代码风格。自以为手撸代码他们也比较满意。结果就是通过所有面试发了offer最后没去。