百度质量部的面试体验之 一面

1.C++纯虚函数和虚函数的区别?


纯虚函数:

基类中定义的一个虚函数,派生类必须实现自己的实现方法。

一是多态性,强制性要派生类

二是含虚函数的类(也就是抽象类)不能实例化,强制性不能实例(水果本身就不能生成实例)


给你们看看纯虚函数:

#include <iostream>

using namespace std;

class A //基类
{
public:
        virtual   void  Demon()= 0;        //纯虚函数

        virtual   void  Base() {cout<<"this is A  class!"<<endl;};
};

class B  :public A  //子类
{
public:
        void Demon() { cout<<" this is SubVirtual!"<<endl;     };

        void Base()  {   cout<<"this is B  class!"<<endl;};
};

class C
{
public:
        virtual void Demon(){};
};

int main()
{
        A* inst = new B(); //multstate pointer
        inst->Demon();
        inst->Base();

        C* cc = new C(); //虚函数类 可以 直接生成实例
        cc->Demon();//函数也能直接调用

        return 0;
}


2.socket编程


其实都挺简单的。。
两边配好端口和IP地址,服务端listen,客户端connect就行了。

server端:
ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
ss.bind((HOST,PORT))
ss.listen(5) //限定连接数为5
while True:
	cs,addr = ss.accept()
	cs.send("200 Connected!")
	rev_data = cs.recv(BUF_SIZE)
	cs.close()


client端:

cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
cs.connect((HOST,PORT))
rev_data = cs.recv(BUF_SIZE)
cs.send("Hi,Server,I am Client!")
cs.close()


想了解更多socket编程,我这里有一篇: python 间谍程序传输文件 socket编程



3.请讲讲TCP 和 UDP的区别


 TCPUDP
是否连接面向连接面向非连接
传输可靠性可靠的不可靠的
应用场合大量的数据少量数据
速度
模式流模式数据报模式
结构复杂度较复杂较简单
系统资源要求较高较低
模式流模式数据报模式


都是传输层的协议,根据上面的对比:重要的状态信息随可靠的TCP连接发送,而主数据流通过UDP发送。

其实这些都快背下来了。这些都是虚的,也别多说了,肯定要问深入一点的。

Ps:
请注意模式,2中谈论到的socket编程,就是流模式,也就是TCP连接。
流模式,才有listen和accept。


什么是面向连接?


“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。

比如:ping 就是 向对方主机发送UDP包。
 

什么情况下用UDP?


数据顺序要求高吗?
数据完整性要求高吗?
数据传输时间短的情况下,以至于连接过程成为整个流量主体的情况下?


编程时候应该注意的区别?


socket()的参数不同
UDP Server不需要调用listen和accept
UDP收发数据用sendto/recvfrom函数
TCP:地址信息在connect/accept时确定
UDP:在sendto/recvfrom函数中每次均 需指定地址信息
UDP:shutdown函数无效


UDP怎么转TCP?


怎么没听过。
不过TCP就是比UDP多了个三次握手+四次挥手,然后多回复一个数据包带一个ACK的标志位。
我们再用UDP的时候,可以自己加一个三次握手这类的回复机制吗。
然后还有就是超时重传功能,UDP也要加一个吧,和序列号有关。




4.设计模式


问到这里的时候,脑海中立马浮现出了:单例模式!
有些对象涉及到重要的系统资源,应该限制只能实例化一个,如IO,如数据库,这种模式就是单例模式。

然后接下来就是一个python的工厂模式:
我不大懂,但是我会怎么用,下面是一个制作line()的工厂函数:
def line_conf(a,b):tu
	def line(x):
		return a*x + b
	return line

line1 = line_conf(1,1)
line2 = line_conf(4,5)

print line1 #6
print line2 #25





5.速度快的排序有什么,说一个你了解多的


快速排序啊
不稳定,从算法上可以看到,两个相同的元素,可以被调换位置。
平均nlgn
最坏n2
如果是基本有序的情况,速度最慢。
其实很好理解,快排本来就是n x n 的冒泡改进成n x lgn ,也就是说其中一个n要是能够二分,就会降低到lgn!
如果做不到二分,就最慢了。

随机化版本是降低遇到worst的概率,而不是降低时间。


这个就是简单的算法:

PARTITION(A,p,r)
	x = A[r]
	i = p-1
	for j = p to r-1
		if A[j] <= x
			i = i+1
	       		exchange (A[i],A[j])
	exchange(A[i+1],A[r])
	return i+1

RANDOM_PARTITION(A,p,r)
	i = RANDOM(p,r)
	exchange(A[i],A[r])
	return PARTITION(A,p,r)


QUICKSORT(A,p,r)
	if p < r
		q = RANDOM_PARTITION(A,p,r)
		QUICKSORT(A,p,q-1)
		QUICKSORT(A,q+1,r)


怎么判断一个序列基本有序


论坛大哥给出了答案:

(1)
对序列进行插入排序,时间比较少 就是相对基本有序

(2)
对序列进行冒泡排序,计数少的, 就是相对基本有序

(3)
if (序列中升序子序列的总长度/序列中降序子序列的总长度<0.1 || 0.9>序列中升序子序列的总长度/序列中降序子序列的总长度) {
 该序列基本有序
} else {
 该序列基本无序
}
这个涉及到了DP,还是别用这个答案了,不然就会问DP(动态规划)了。


6.常用linux命令(保过面试)


显示目录和文件的命令


   ls:用于查看所有文件夹的命令。
   dir:用于显示指定文件夹和目录的命令   Tree: 以树状图列出目录内容
   du:显示目录或文件大小 
 

修改目录,文件权限和属主及数组命令


   chmod:用于改变指定目录或文件的权限命令。
   chown:用于改变文件拥有属性的命令。
   chgrp:用于改变文件群组的命令。
   chattr:用于设置文件具有不可删除和修改权限。
   lsattr:用于显示文件或目录的隐藏属性。
 

创建和删除目录的命令


   mkdir:用于创建目录
   rmdir:用于删除空的目录
   rm -f:用于删除不为空的目录
 

创建和删除,重命名,复制文件的命令


  touch:创建一个新的文件
   vi:创建一个新的文件
   rm:删除文件或目录
   mv:重命名或移动文件的命令
   cp:复制命令
   scp:用于将本地的文件或目录复制到远程服务器
   wget:用于下载ftp或http服务器文件到本地。
 

显示文件内容的命令


   cat:用于显示指定文件的全部内容
   more:用分页的形式显示指定文件的内容
   less:用分页的形式显示指定文件的内容,区别是more和less翻页使用的操作键不同。
   head:用于显示文件的前n行内容。
   tail:用于显示文件的后n行内容。
   tail -f:用于自动刷新的显示文件后n行数据内容。
 

查找命令


   find:查找指定目录或文件的命令。
   whereis:查找指定的文件源和二进制文件和手册等
   which:用于查询命令或别名的位置。
   locate:快速查找系统数据库中指定的内容。
   grep:在指定的文件或标准输出,标准输入内,查找满足条件的内容。
 

关机和重启计算机的命令

     
   shutdown:-r 关机后立即重启
             -k 并不真正的关机,而只是发出警告信息给所有用户
             -h 关机后不重新启动
   poweroff:用于关机和关闭电源
   init:改变系统运行级别
        0级用于关闭系统
        1 级用于单一使用者模式
        2级用来进行多用户使用模式(但不带网络功能)
        3级用来进行多用户使用模式(带网络全功能)
        4级用来进行用户自定义使用模式
        5级表示进入x  windows时的模式
        6级用来重启系统
   reboot: 用于计算机重启
   halt:用于关闭计算机系统
 

压缩和打包命令


   tar:用于多个文件或目录进行打包,但不压缩,同时也用命令进行解包
   gzip:用于文件进行压缩和解压缩命令,文件扩展名为.gz结尾。
   gunzip:用于对gzip压缩文档进行解压缩。
   bzip2:用于对文件或目录进行压缩和解压缩
   bzcat:用于显示压缩文件的内容。
   compress/un compress: 压缩/解压缩.Z文件
   zcat:查看z或gz结尾的压缩文件内容。
   gzexe:压缩可执行的文件
   unarg:解压缩.arj文件
   zip/unzip:压缩解压缩.zip文件
 

用户操作命令


   su:切换用户命令
   sudo:一系统管理员的身份执行命令
   passwd:用于修改用户的密码
 

改变目录和查看当前目录命令


   cd:进入工作目录
   cd  ..:会退到上一级命令
   Pwd:显示当前用户所在工作目录位置
 

文件连接命令


   ln:为源文件创建一个连接,并不将源文件复制一份,即占用的空间很小。
可以分为软件连接和硬链接。
软连接:也称为符号连接,即为文件或目录创建一个快捷方式。
硬链接:给一个文件取多于一个名字,放在不同目录中,方便用户使用。
 
命令参数如下:
   -f:在创建连接时,先将与目的对象同名的文件或目录删除。
   -d:允许系统管理者硬链接自己的目录。
   -i:在删除与目的对象同名文件或目录时先询问用户。
   -n:在创建软连接时,将目的对象视为一般的文件。
   -s:创建软连接,即符号连接。
   -v:在连接之前显示文件或目录名。
   -b:将在连接时会被覆盖或删除的文件进行备份。
 

帮助命令-----man


其他命令


   who:显示系统中有那些用户在使用。
        -ami  显示当前用户
        -u:显示使用者的动作/工作
        -s:使用简短的格式来显示
        -v:显示程序版本
   free:查看当前系统的内存使用情况
   uptime:显示系统运行了多长时间
   ps:显示瞬间进程的动态
   pstree:以树状方式显示系统中所有的进程
   date:显示或设定系统的日期与时间。
   last:显示每月登陆系统的用户信息
   kill: 杀死一些特定的进程
   logout:退出系统
   useradd/userdel:添加用户/删除用户
   clear:清屏
   passwd:设置用户密码
 
 

vi编辑器


   首先用vi命令打开一个文件
末行模式命令:
   :n,m w path/filename 保存指定范围文档( n表开始行,m表结束行)
   :q!    对文件做过修改后,强制退出
   :q     没有对文件做过修改退出
   Wq或x  保存退出
   dd   删除光标所在行
   : set number 显示行号
   :n 跳转到n行
   :s  替换字符串 :s/test/test2/g  /g全局替换 /也可以用%代替
   / 查找字符串
 

网络通信常用的命令


   arp:网络地址显示及控制
   ftp:文件传输
   lftp:文件传输
   mail:发送/接收电子邮件
   mesg:允许或拒绝其他用户向自己所用的终端发送信息
   mutt E-mail 管理程序
   ncftp :文件传输
   netstat:显示网络连接.路由表和网络接口信息
   pine:收发电子邮件,浏览新闻组
   ping:用于查看网络是否连接通畅
   ssh:安全模式下远程登陆
   telnet:远程登录
   talk:与另一用户对话
   traceroute:显示到达某一主机所经由的路径及所使用的时间。
   wget:从网路上自动下载文件
   write:向其它用户终端写信息    Rlogin:远程登录


7. 判断URL是不是在域名list中


这有何难?
一个正则 [http[\w]?://\w*/?]  最后的一个s是最小匹配
这样就能匹配到如:http://www.baidu.com/,如https://github.com/
问题是遇到 http://www.baidu.com 没法匹配,所以加个判断,如果匹配不到,就[http[\w]?://\w*],这样就能考虑到特殊情况了
搞定


8. 判断链表是否有环


就是生成两个Head指针,一个走的快,一个走的慢
如果在一定步骤后,快的能追上慢的,就表示有环。
思想参照:机械表时钟


9.怎么生成测试用例


JUnit 怎么生成测试用例?


首先你需要添加一个JUNIT的Library
在你的工程上单击右键---> propertites ---> JAVA BUILD PATH ---> Libraries ---> Add Library ---> JUNIT ---> OK

然后编写测试代码,你写的测试类必须继承TestCase,并且测试方法必须以test开头的方法,才会在run junit test的时候被执行(当然你也可以加入测试套件进行)


三角形怎么生成测试用例?


A=

输入有误的

非法字符

<=0



B=

能三角


C= 

不能三角 


B1=

等边

等腰

普通


B2=

直角

钝角

锐角


测试用例就是: B1 X  B2  and 去掉明显不可能的(如等边直角三角形)



杯子怎么生成测试用例?


测试项目:杯子


  需求测试:查看杯子使用说明书


  界面测试:查看杯子外观


  功能度:用水杯装水看漏不漏;水能不能被喝到


  安全性:杯子有没有毒或者细菌


  可靠性:杯子从不同高度落下的损坏程度


  可移植性:杯子在不同的地方、温度等环境下是否都可以正常使用


  兼容性:杯子是否能够容纳果汁、白水、酒精、汽油等


  易用性:杯子是否烫手、是否有防滑措施、是否方便饮用


  用户文档:使用手册是否对杯子的用法、限制、使用条件等有详细描述


  疲劳测试:将杯子盛上水(案例一)放24小时检查泄漏时间和情况;盛上汽油(案例二)放24小时检查泄漏时间和情况等


  压力测试:用根针并在上面不断加重量,看压强多大时会穿透


  跌落测试:杯子加包装(有填充物),在多高的情况下摔下不破损


  震动测试:杯子加包装(有填充物),六面震动,检查产品是否能应对恶劣的铁路\公路\航空运输



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值