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的区别
TCP | UDP | |
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠的 | 不可靠的 |
应用场合 | 大量的数据 | 少量数据 |
速度 | 慢 | 快 |
模式 | 流模式 | 数据报模式 |
结构复杂度 | 较复杂 | 较简单 |
系统资源要求 | 较高 | 较低 |
模式 | 流模式 | 数据报模式 |
都是传输层的协议,根据上面的对比:重要的状态信息随可靠的TCP连接发送,而主数据流通过UDP发送。
其实这些都快背下来了。这些都是虚的,也别多说了,肯定要问深入一点的。
Ps:
请注意模式,2中谈论到的socket编程,就是流模式,也就是TCP连接。
流模式,才有listen和accept。
什么是面向连接?
“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。
比如:ping 就是 向对方主机发送UDP包。
什么情况下用UDP?
数据顺序要求高吗?
数据完整性要求高吗?
数据传输时间短的情况下,以至于连接过程成为整个流量主体的情况下?
数据传输时间短的情况下,以至于连接过程成为整个流量主体的情况下?
编程时候应该注意的区别?
socket()的参数不同
UDP Server不需要调用listen和accept
UDP Server不需要调用listen和accept
UDP收发数据用sendto/recvfrom函数
TCP:地址信息在connect/accept时确定
UDP:在sendto/recvfrom函数中每次均 需指定地址信息
UDP:shutdown函数无效
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 {
该序列基本无序
}
该序列基本有序
} 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:在指定的文件或标准输出,标准输入内,查找满足条件的内容。
du:显示目录或文件大小
修改目录,文件权限和属主及数组命令
chown:用于改变文件拥有属性的命令。
chgrp:用于改变文件群组的命令。
chattr:用于设置文件具有不可删除和修改权限。
lsattr:用于显示文件或目录的隐藏属性。
创建和删除目录的命令
rmdir:用于删除空的目录
rm -f:用于删除不为空的目录
创建和删除,重命名,复制文件的命令
vi:创建一个新的文件
rm:删除文件或目录
mv:重命名或移动文件的命令
cp:复制命令
scp:用于将本地的文件或目录复制到远程服务器
wget:用于下载ftp或http服务器文件到本地。
显示文件内容的命令
more:用分页的形式显示指定文件的内容
less:用分页的形式显示指定文件的内容,区别是more和less翻页使用的操作键不同。
head:用于显示文件的前n行内容。
tail:用于显示文件的后n行内容。
tail -f:用于自动刷新的显示文件后n行数据内容。
查找命令
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:将在连接时会被覆盖或删除的文件进行备份。
who:显示系统中有那些用户在使用。
-ami 显示当前用户
-u:显示使用者的动作/工作
-s:使用简短的格式来显示
-v:显示程序版本
free:查看当前系统的内存使用情况
uptime:显示系统运行了多长时间
ps:显示瞬间进程的动态
pstree:以树状方式显示系统中所有的进程
date:显示或设定系统的日期与时间。
last:显示每月登陆系统的用户信息
kill: 杀死一些特定的进程
logout:退出系统
useradd/userdel:添加用户/删除用户
clear:清屏
passwd:设置用户密码
首先用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:远程登录
-k 并不真正的关机,而只是发出警告信息给所有用户
-h 关机后不重新启动
poweroff:用于关机和关闭电源
init:改变系统运行级别
0级用于关闭系统
1 级用于单一使用者模式
2级用来进行多用户使用模式(但不带网络功能)
3级用来进行多用户使用模式(带网络全功能)
4级用来进行用户自定义使用模式
5级表示进入x windows时的模式
6级用来重启系统
reboot: 用于计算机重启
halt:用于关闭计算机系统
压缩和打包命令
gzip:用于文件进行压缩和解压缩命令,文件扩展名为.gz结尾。
gunzip:用于对gzip压缩文档进行解压缩。
bzip2:用于对文件或目录进行压缩和解压缩
bzcat:用于显示压缩文件的内容。
compress/un compress: 压缩/解压缩.Z文件
zcat:查看z或gz结尾的压缩文件内容。
gzexe:压缩可执行的文件
unarg:解压缩.arj文件
zip/unzip:压缩解压缩.zip文件
用户操作命令
sudo:一系统管理员的身份执行命令
passwd:用于修改用户的密码
改变目录和查看当前目录命令
cd ..:会退到上一级命令
Pwd:显示当前用户所在工作目录位置
文件连接命令
可以分为软件连接和硬链接。
软连接:也称为符号连接,即为文件或目录创建一个快捷方式。
硬链接:给一个文件取多于一个名字,放在不同目录中,方便用户使用。
命令参数如下:
-f:在创建连接时,先将与目的对象同名的文件或目录删除。
-d:允许系统管理者硬链接自己的目录。
-i:在删除与目的对象同名文件或目录时先询问用户。
-n:在创建软连接时,将目的对象视为一般的文件。
-s:创建软连接,即符号连接。
-v:在连接之前显示文件或目录名。
-b:将在连接时会被覆盖或删除的文件进行备份。
帮助命令-----man
其他命令
-ami 显示当前用户
-u:显示使用者的动作/工作
-s:使用简短的格式来显示
-v:显示程序版本
free:查看当前系统的内存使用情况
uptime:显示系统运行了多长时间
ps:显示瞬间进程的动态
pstree:以树状方式显示系统中所有的进程
date:显示或设定系统的日期与时间。
last:显示每月登陆系统的用户信息
kill: 杀死一些特定的进程
logout:退出系统
useradd/userdel:添加用户/删除用户
clear:清屏
passwd:设置用户密码
vi编辑器
末行模式命令:
:n,m w path/filename 保存指定范围文档( n表开始行,m表结束行)
:q! 对文件做过修改后,强制退出
:q 没有对文件做过修改退出
Wq或x 保存退出
dd 删除光标所在行
: set number 显示行号
:n 跳转到n行
:s 替换字符串 :s/test/test2/g /g全局替换 /也可以用%代替
/ 查找字符串
网络通信常用的命令
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
在你的工程上单击右键---> 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小时检查泄漏时间和情况等
压力测试:用根针并在上面不断加重量,看压强多大时会穿透
跌落测试:杯子加包装(有填充物),在多高的情况下摔下不破损
震动测试:杯子加包装(有填充物),六面震动,检查产品是否能应对恶劣的铁路\公路\航空运输