常见面试、技术汇总

-今天,百度二面的时候,运到了一个非常nice的面试官。听到最近找工作不顺心的时候,非常耐心的给我聊了一个多小时吧,从修改简历到如何复习,在到目前企业的架构是怎么样的,流程如何等等,讲了很多很多。最重要的是告诉我应该懂得反思,每次面完以后,应该去整理面试过程中的问题,这样才能有所提高

 面试总结 

1、操作系统都有哪些功能? 
答:CPU的控制与管理,内存分配与管理,外部设备的控制与管理,文件管理,作业管理与控制。 
2、内存管理都有哪些方式? 
答:段式管理(外部碎片),页式管理(内部碎片),段页式管理(主存分页,页内分段) 
3、数据库引擎都有哪些,各有什么有缺点? 
答:MYISAM(默认引擎)和INNODB(还有其他的,随意)。 
  1)MYISAM不支持事务,INNODB支持事务; 
  2)MYISAM非聚簇索引,INNODB聚簇索引; 
  3)MYISAM读取速率更高,适用于读多写少的场景; 
4、synchronized,Lock区别? 
答: 
  1)在发生异常的时候,synchronized会释放所有的锁,而Lock则不会。 
  2)Lock可以让等待锁的线程响应中断,而synchronized则不行。 
  3)Lock是乐观锁(CAS原理),synchronized是悲观锁。 
5、springmvc原理,AOP原理。 
6、linux 查看文件可滚动,查找数据,查看线程? 
答: 
  查看滚动文件:tail -f 文件名;方便查阅正在改变的日志文件。会把最尾部的内容显示在屏幕上,并且不断刷新,使你看到最新的文件内容。 
  查看滚动文件,同时过滤:tail -f ./attack.log |grep “10.1.1.1” 

  查看某个进程的所有线程:ps -T -p pid(表示端口号);ps默认是显示进程的,加了-T之后是会显示线程。

===========

面试官先让我做自我介绍。然后马上就谈项目了,叫我挑一个项目讲讲怎么做的,解决了什么问题。问项目我最不怕了,毕竟项目都是自己认真地完成的,也确实在做项目过程中学到了很多东西,解决了一些问题。

然后就问问我在华为实习的情况。

说完他让我写写程序,问我知道哪些排序算法,叫我写一个熟悉的排序算法。居然让我自己选择,那果断快速排序啊。如下:

  1. void quick_sort(int array[], int begin, int end)
  2. {
  3.         if(end > begin)
  4.         {
  5.                 int pivot = begin;
  6.                 int last_small = begin;
  7.                 int i = end;
  8.                 while(last_small != i)
  9.                 {
  10.                         if(array[i] <= array[pivot])
  11.                         {
  12.                                 int temp = array[i];
  13.                                 array[i] = array[++last_small];
  14.                                 array[last_small] = temp;
  15.                         }
  16.                         else
  17.                                 i--;
  18.                 }
  19.                 int tmp = array[pivot];
  20.                 array[pivot] = array[last_small];
  21.                 array[last_small] = tmp;
  22.                 quick_sort(array, begin, last_small - 1);
  23.                 quick_sort(array, last_small + 1, end);
  24.         }
  25. }
复制代码

然后叫我写反转链表。。太经常问了这问题。但他一开始说不允许另外开辟地址,我还以为临时变量都不让声明,我就说这有点难。但是过一会他纠正了,临时变量是可以的。

  1. void reversal(listNode* head)//reverse the list
  2.         {
  3.                 listNode* before = NULL;
  4.                 listNode *current = head;
  5.                 listNode *temp = head;
  6.                 while(current != NULL)
  7.                 {
  8.                         listNode* next = current->next;
  9.                         current->next = before;
  10.                         before = current;
  11.                         current = next;
  12.                 }
  13.                 head = before;
  14.         }
复制代码

问:在已排序好的数组找两个数a+b等于给定的N。

对于一个数组array,长度为size,令begin = 0,end = size - 1,判断array[begin] + array[end] 与n的大小关系,如果相等,则找到;如果小于,则begin++,如果大于,则end--,然后继续做前面判断。这样基本上效率能最快了,因为是O(n)。

问:不用第三个参数调换整数a和b

他问了之后我就说这题我会,说真的,这题要是之前不知道,要在面试的时候想出来基本不可能。要用异或操作符来做:

  1. a = a^b;
  2. b = a^b;
  3. a = a^b;
复制代码

然后用a= 101,b = 111测试了一下,根据上面操作a = 010;b = 101; a = 111正确。


问:堆栈区别

说了一下四点:

1)栈是连续的,堆是不连续的;2)栈元素自动释放,堆元素要手动释放;3)栈从高地址开始存储向下增长,堆相反;4)存储读取效率上栈比堆快。

还问通常什么存储在栈中,答函数参数、局部变量等。

接下来他看了我的笔试题试卷,主要是讨论最后一道题:如下


情景:新浪微博发布内容要求字符不超过140,但是用户如果在发布内容中有很长的url时,会认为是很多字符。所以新浪上发布内容包含一个URL时,时把他压缩成一个TinyURL(缩小)。比如:

输入:http://zhidao.baidu.com/search?c ... e=utf-8&fr=wwwt

实际显示:http://asdfa.cn/ak78ss。(这里我只是随便举了个例子)

前面asdfa.cn是对应域名 zhidao.baidu.com,后面长长的字符串被压缩成ak78ss。

现在让你来设计TinyURL的实现,一下问题要怎么设计:

问题一:域名后面的编码如何实现?

问题二:对于已经映射过的一个URL,怎么查找已存在的TinyUrl?

问题三:有10亿个url,一个服务上存不下,需要多台服务器,怎么设计实现?

问了一个问题,说你觉得让你来设计这样一个服务,最大的问题是什么?我说是tinyurl的hash表存储,因为数据量真的非常大。他问那你要怎么存储,我说要用二次哈希吧,先根据hash值存储到对应的服务器上面,再进行hash存储。

接着他问我试卷上memcpy怎么没写?我说我当时对这个函数不了解。他叫我现在做一下这个题。我就不贴代码了,写得太烂,他说要在复制的时候考虑内存溢出问题。有兴趣的可以网上找实现代码。


后面是一道概率问题,一个山区的村子,生孩子直到生了一个男孩为止。题目就不多说了,网上不久有这道原题么?但我之前根本没看答案。所以我一开始在纸上一个劲地计算,最后发现计算不出来之后,我给了他这样的答案,说我觉得是1:1。为什么?因为生男生女概率本来就都是二分之一,无论定义怎么的规则生孩子,生男生女概率就是不会变,所以数量多了之后男女比例是1:1。我不知道他是否想要这样的答案,但我觉得我当时挺机智的。他说原理是什么呢?我说,当数量足够大的时候,概率比就是数量比。随后他爽快地说:去二面吧!


二面基本就是在考算法和数学了!总共四到题目:

一   写程序实现十进制转n进制,返回值类型自己定义。我就实现 了一个 string result(int m, int n)//m表示十进制数,n表示进制数。现场写的代码不完整,回来再完善了下:

  1. #include<iostream>
  2. #include<string>
  3. #include<stack>
  4. using namespace std;
  5. string transform(int n, int m)
  6. {
  7.         stack<char> s;
  8.         bool negative;
  9.         if(n < 0)
  10.         {
  11.                 negative = true;
  12.                 n = 0 - n;
  13.         }
  14.         else negative = false;
  15.         while(n != 0)
  16.         {
  17.                 char tmp;
  18.                 int mod = n % m;
  19.                 if(mod > 9)
  20.                         tmp = 'A' + mod - 10;
  21.                 else tmp = '0' + mod;
  22.                 s.push(tmp);
  23.                 n /= m;
  24.         }
  25.         int index = 0;
  26.         int len = s.size();
  27.         if(negative)
  28.                 ++len;//为负数,加负号
  29.         string result('1', len);
  30.         if(negative)
  31.                 result[index++] = '-';
  32.         while(!s.empty())
  33.         {
  34.                 result[index++] = s.top();
  35.                 s.pop();
  36.         }
  37.         return result.substr(0, len);
  38. }
复制代码

二  一个数组由a,b,c,d,e五个字符组成,设计一种算法找出一个包含这五种字符的最小区间,数组是循环的,也就是可以有这样的区间(9,2)

    因为要包含五个字符,所以最小区间长度是5。所以我最开始想到的就是让区别数从5开始往上递增,对于每一个区间数比如5,遍历数组的所有区间,判断是否包含5个字符,是的话就刚好找到了最小区间。然后这复杂度算了一下是O(n^3)了,接着在面试官的指导下我优化到了O(n^2)。他说其实最优的可以O(n),不过能优化到O(n^2)已经不错了。

三  概率题

有四种颜料,给下面8个方格填色,每相邻两个不能用同一种颜色,有多少种填色方法?

  

想了一下,挺简单的,就是4 * 3^7。然后他加了条件,首尾也不能用同种颜色。他这样加条件后我想了很久,中间也说了我的逻辑,我觉得没挺严谨的,但就是错误。最后没能想出正确答案。



四  也是一道在网上看到过的题目,但就是之前没去看答案,也没思考过。

百度hi有个日志文件存了用户的上线时间和下线时间,格式为  userid      hh:mm::ss(上线)   hh:mm:ss(下线),一行一条数据。问,如何统计一天内每一秒在线的用户数量。数据量100w。

我最终是想出了复杂度 大概在100w*40左右的算法,他好像也比较满意,但说最优可以到100W加一个常数。

=============

1.刚开始还是自我介绍(把自己的项目经历以及主要擅长的方面介绍一下)
2.讲自己的项目经历,把做过的一些项目包括架构,业务流程,实现过程中的一些技术难点(我们这个肯定比较水,大概讲了一下业务流程)讲了一遍,这个过程中有问了一下多个本地数据库访问远程数据库的冲突解决(我说的是在访问本地数据库之前设置有权限,即不同的本地数据库的访问权限不同),又问了界面如何于客户端进行的通信(我们用的是QT,所以大概讲了一下通信的过程,QSoctet 利用TCP进行数据传输,访问服务端主机的IP和端口号建立通信)
3.又问了关于语言的方面的:C++,JAVA 的区别、什么是面向对象、面向对象的特点(封装,继承,多态)、分别解释每个特点(对多态答的不是很全面)、针对封装中(private,public,protect)进行解释、C++中三种动态内存分配的方式(我只知道两个malloc,new)、malloc和new的分配内存方式(堆分配还是栈分配)、全局变量的内存分配方式是堆分配还是栈分配、堆分配和栈上分配内存两者有什么区别和联系。(基本没答上)
4.接下来问了关于网络方面的:ISO七层模型和TCP/IP四层模型、分别哪些层、每一层都是干什么的、TCP的三次握手、TCP传输和UDP的传输数据区别、TCP的传输是在哪一层。
5.问了算法方面:给一个大文件,里面存一些词语,用户输入关键词,用什么方式可以快速查找到用户想要的单词?(我说了一个建立索引表,他就问数据库里的索引是怎么实现的--不会)、那一些插入的算法时间复杂度O(1)(折半插入大概o(nlgn),快排的方式实现插入,最好情况是(o(1)),红黑树)。
6.如何测试搜索引擎的好坏(大概说了两点:1.响应时间2.检索词条内容。是在时菜,想不出来了)
7.最后的了解一下Linux的使用情况,这里仅仅会一些简单的命令行操作。

猜你喜欢

转载自blog.csdn.net/zb872676223/article/details/79274340