• 整理面试题


    面试题目

     

    • 逻辑题
    • 测试思路
    • 数据库
    • 计算机网络
    • 计算机系统结构
    • 编程题(按难度排序,easy–> hard)
    • 语言
    • 编译
    • 操作系统

     

    逻辑题

    有八個大小相等的球,其中有一個重量比其他球略重。如何在只用天平稱兩次的情況下找出那個不一樣的球?

    答案:從八個球中取出六個,在天平兩邊各放三個。如果平衡,把剩下的兩個球分別放在天平兩邊,就能找出較重的球。如果不平衡,較重的球就在天平下沉的一邊,從這三個當中取出兩個稱量,若不平衡,下沉的一邊較重,若平衡,剩下的就是較重的球。

    假设有6个相同的玻璃杯子,前面三方放了水,后面三个是空的。要求只能移动一个杯子,把放了水的和空的杯子间隔开?

    答案:把第二个杯子的水倒入第五个杯子

    1. 假定有个青蛙上台阶每次只能跳一步或者跳两步,那么上N个台阶有几种跳法?(问的时候可以变换下,比如小明上楼梯) 答案:转换成斐波那契数列问题

    10个箱子,每个箱子10袋奶粉,每袋奶粉重1Kg,但是其中有一个箱子里面的奶粉都只有0.9kg。给你一个电子秤,如何只秤一次就能找到是那个箱子里面放的是 0.9 kg 的奶粉?

    1. 答案:给箱子编号:1、2、3、...10,依次取出一个、两个、三个、...十个,(1+2+3+...+10)×1=55(kg)

         用称出的重量和55kg比较,少0.1kg,就是1号;少0.2kg,就是2号;以此类推。

     

    测试思路

    如何测试自动售货机?

    答题要点:思路是否清晰,需要包括包括正常使用情况、异常情况的测试~

    atoi() 函数(把ASC码字符串转换成整数)设计测试用例

    答题要点:

    字符串空 

    符号

    包含非数字字符

     + 、- 号

    数字溢出

    数据库

    假设有个数据表里面记录了美团所有员工的 id ,姓名,部门等信息,请统计美团公司每个部门有多少个员工?

    答案:select department_name, count( * ) as employee_num from employees group_by department_name;

    计算机网络

    TCP 协议是如何做到可靠传输的?

    答题要点:三次握手、滑动窗口协议~

    在浏览器上输入一个 url 比如 http://www.meituan.com 在网络通信的过程中主要用到了哪些网络协议,每个协议分别作了什么?

    答题要点:应该是包括了 HTTP、TCP、IP、ARP 协议。具体参考下图,摘自《图解 HTTP》:

     

    计算机系统结构

    1. malloc 申请内存是放在堆上还是栈上?堆和栈的区别(拔高题目)malloc 具体是怎么做的? 前两问答案:放在堆上。堆和栈的区别参考:http://blog.chinaunix.net/uid-26868581-id-3328648.html 第三问:参考 http://www.findfunaax.com/notes/file/170
      1. 什么是 big endian little endian?如何解决网络传输中的字节序问题?出自《深入理解计算机系统》 答案要点:big endian: 从高字节开始存;little endian:从低字节开始存。不同类型的机器之间通过网络传送二进制数据时,都通过统一的网络字节序(大端)进行传输,接收端和传送端都根据自己的主机字节序进行相应的转换。转换用到的函数如下:

    inet_ntoa() 将网络字节序地址转换成“.”点隔的字符串格式 inet_addr() 将“.”点隔字符串地址转换成网络字节序地址

    htonl() 将主机字节序转换为网络字节序 long ntohl() 将网络字节序转换为主机字节序 long

    htons() 将主机字节序转换为网络字节序 short ntohs() 将网络字节序转换为主机字节序 short

     

    编程题(按难度排序,easy–> hard)

    1. 假定输入是一个字符串,该字符串由() [] {} 组成, 判断一个字符串里面的括号是否是闭合的,如果闭合返回 True ,否则返回 False(暂时不问了) 解题思路:就是遇到一个左括号就压栈,遇到一个右括号就弹栈,看是否匹配就好了。最后检查下栈里是不是有剩余的括号就行了。 代码参考:http://blog.csdn.net/alps1992/article/details/38225623
      1. 判断一个单链表存储的数据是不是回文,要求尽可能少得时空复杂度。如:1->2->1,return ture. and 1->2->3->1 return false; 解题思路:该题目是判断单链表是否有环的一个变形,也是利用快慢指针来实现。

    1. 使用2个指针,快慢指针各一个,每次快指针移动2个,慢指针移动1个。

    2. 当快指针不为NULL时候,将慢指针指向的节点元素push到栈中。

    3. 当快指针等于NULL时候,说明链表前半部分数据已经被压入栈中。

    4. 每次栈Top元素与当前慢指针元素比较,如果不相等则返回false。如果相等,则栈Pop,慢指针++。

    1. 代码参考:http://blog.csdn.net/wuxinliulei/article/details/22730041
    2. // Input  -> "I have  36 BOOKS, 40 pens2, and 1 notebook." // Output -> "I evah  36 skoob, 40 2snep, dna 1 koobeton."(这个题目有点绕) 如果是数字,原样输出,如果不是,那么倒序。 答题思路:碰到数字往下走,如果一直走到标点或者空格那么就把数字的这个 substring 加上去,如果中间就跳出了,那么返回到原来的 index,把字符串倒序。(连reverse函数都出现了两个小错误。。),添加到 result 字符串上去。
    3. 设计一个数据结构,使得对 Student 类的 插入、删除和随机选择是时间复杂度都是 o(1) 解题思路:可以使用一个数组和哈希表来实现这些操作。数组存放所有的Server,哈希表记录每个Server在数组中的位置(下标)。以上3种操作的算法如下:
      1. 加入一个 Student:将 Student 加入到数组尾部,并更新哈希表。
      2. 删除一个 Student :从哈希表中获得需要删除的 Student 在数组中的下标index,并从哈希表中删除该 Student 的数据。然后将数组的最后一个元素和index位置的元素交换,并将数组长度减1。
      3. 随机选择一个 Student:假设数组长度为n,产生一个0到n-1的随机数,并返回数组中相应位置的 Student。

    注意加入一个元素到数组时需要自动调整数组大小(比如C++的vector,java中的ArrayList),但是均摊时间复杂度仍然为O(1)。

    1. 给定一个字符串 s 和一个单词字典 dict, 判断能否以空格作为间隔,分成一个或多个字典中的单词。 解题思路:最直接的思路就是递归,很简单。我们考虑每一个前缀,是否在字典中?如果在,则递归处理剩下的字串,如果不在;则考虑其他前缀。加分解法:利用动态规划保存中间结果。具体详见:http://chuansongme.com/n/651846
    2. 判断一个树是不是平衡二叉树?
    3. 层次遍历二叉树?
    4. 给定数组A,大小为n,数组元素为1n的数字,设计一个时间复杂度是 O 的方法,对这个数组进行排序 解题思路:hash~
    5. 如何判断两个链表是否相交?
    6. 统计某个数字在一个排序的数组中出现的次数 解题思路:二分查找。

    语言

    C++ 中什么时候会用到 static 成员变量和成员函数?

    参考答案:需要一个数据对象为整个类而非某个对象服务, 同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。

    static的内部机制:静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。 这样,它的空间分配有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是类定义的内部实现,那里有类的成员函数定义;三是应用程序的 main()函数前的全局数据声明和定义处。 静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员)。类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所以在 类声明中写成定义是错误的。它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。 static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态 数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。 

    static的优势:可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。

    C++ 中的智能指针?

     智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

    C++ 里面深拷贝和浅拷贝的区别

    相信大家都知道,不罗嗦了~~

    C++ 里虚继承是为了解决什么问题?

    参考答案:虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下:

    class A

    class B1:public virtual A;

    class B2:public virtual A;

    class D:public B1,public B2;

    虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,也并不常用,而一旦离开了多重继承,虚拟继承就完全失去了存在的必要因为这样只会降低效率和占用更多的空间。

     

     

    编译

    1. 描述下 C 语言编译链接的过程

      

    1. 参考答案:编译:把文本形式的源代码翻译成机器语言形式的.o目标文件的过程;链接:把目标文件、操作系统中得启动代码和用到的库文件进行组织、最后形成可执行代码的过程。
      1. 动态链接库和静态链接库? 答案:

    静态链接库以.a(archive)结尾。静态库就是一些目标文件的集合。静态库在程序链接的时候使用,链接器会将程序中使用到函数的代码从库文件中拷贝到应用程序中。一旦链接完成,在执行程序的时候就不需要静态库了。由于每个使用静态库的应用程序都需要拷贝所用函数的代码,所以静态链接的文件会比较大。

    动态链接库以.so(shared object)结尾。一个与共享库链接的可执行文件仅仅包含它用到的函数相关的一个表格,而不是外部函数所在的对象文件的整个机器码。在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该共享库中复制到内存中----这个过程被称作动态链接(dynamic linking)。

    1. 使用链接库的时候出现  undefined reference 是什么问题? 答案:在链接时没有添加链接时需要的库文件;链接顺序不对。

    操作系统

    1. 虚拟内存是为了解决什么问题?是怎么实现的?讲讲操作系统里面的几种页面置换算法? 参考:最佳置换算法(OPT)(理想置换算法)、先进先出置换算法(FIFO)、最近最久未使用(LRU)算法等
  • 相关阅读:
    sklearn1.1.5.弹性网
    Win10 1903过TP的双机调试
    sklearn1.1.3.Lasso
    sklearn的持续更新1.1 广义线性回归模型1.1.1.
    X32进程注入x64DLL到x64进程
    java——接口作为成员变量类型
    java——API——Scanner类
    java——类作为成员变量类型
    java——接口作为方法的参数和返回值
    java——API——匿名对象
  • 原文地址:https://www.cnblogs.com/summer-sun/p/5491017.html
Copyright © 2020-2023  润新知