一、*TVE在线笔试
三个测试,c++软件工程师的测试感觉不难,反而前面的行测题因为漫不经心地做,最后发现题量略多,做不完,也是醉了。。。下面凭借印象记一下几个不大确定的题目,仅当做个人的自我反省,毕竟是第一次啊,准备各种不充分。
1、IOS七层模型中各层的相关协议
网际层协议:包括:IP协议、ICMP协议、ARP协议、RARP协议。传输层协议:TCP协议、UDP协议。
应用层协议:FTP、Telnet、SMTP、HTTP、RIP、NFS、DNS。
2、TCP与UDP的类似之处
3、中断响应时间是指什么
中断的响应时间就是中断的响应过程的时间,中断的响应过程是当有事件产生,进入中断之前必须先记住当前正在做的事情,然后去处理发生的事情,处理这个过程的时间,叫做中断响应时间。注意:是“处理”中断的时间。
4、析构函数
析构函数不返回任何值,没有函数类型,也没有函数参数,也不能重载。5、传值
void sub(int x,int y,int*z){
*z=y-x;
}
main()
{
int a,b,c;
sub(10,5,&a);
sub(7,a,&b);
sub(a,b,&c);
printf("%4d,%4d,%4d\n",a,b,c);
}
答:
sub (10,5,&a); // a=5-10
sub(7,a,&b); // b= (-5)-7
sub(a,b,&c); // c= (-12)-(-5)
sub函数的三个参数前两个是传值的,对原来的变量不会修改,第三个参数是指针,对它的修改就是修改原来main函数里的变量。基础题目,差点搞错了。
函数传参:传值、传址、传引用
传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。
传址,就是传变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。
传引用,实际是通过指针来实现的,能达到使用的效果如传址,可是使用方式如传值。
如果传值的话,会生成新的对象,花费时间和空间,而在退出函数的时候,又会销毁该对象,花费时间和空间。
因而如果int,char等固有类型,而是你自己定义的类或结构等,都建议传指针或引用,因为他们不会创建新的对象。
6、linux显示一个文件最后几行的命令tail
tail -n 行数注意:是tail不是less,差点又搞错了
7、微机中存储速度最快的当然是——内存啦!
8、排序算法的空间复杂度:快排最大
9、基本有序序列排序最快的是——插入或者冒泡!
排序方法 比较次数 移动次数 稳定性 辅助空间最好 最差 最好 最差 最好 最差
冒泡排序 n n^2 0 n^2 是 1 1
快速排序 nlogn n^2 logn n 否 logn n
堆排序 nlogn nlogn nlogn nlogn 否 1 1
而当待排序列已基本有序时,对冒泡排序来说是最好情况,对快速排序来说就是最差情况,而堆排序则最好最差都一样。因此本题答案是冒泡排序。
10、三叉树的度数
度数,可理解为子树个数,二叉树结点最多有两个子树,所以二叉树结点的度数最大为2。题目给出0度和2度的节点个数,求1度的节点个数(貌似)
类似的题目如下:
在—棵度为3的树中,若有2个度为3的结点,有1个度为2的结点,则有__(9)__个度为0的结点。
A.4 B.5 C.6 D.7
因为三叉树中所有结点的度数均不大于3,所以结点总数(记为n)应等于0度结点数、1度结点(记为n1)、2度结点数(n2)和3度结点数(n3)之和:
n=no+n1+n2+n3 (式子1)
另一方面,1度结点有一个孩子,2度结点有两个孩子,3度结点有三个孩子,故三叉树中孩子结点总数是:
nl+2n2+3n3
树中只有根结点不是任何结点的孩子,故二叉树中的结点总数又可表示为:
n=n1+2n2+3n3+1 (式子2)
由式子1和式子2得到:
no=n2+2n3+1
选C
二、*VTE软件工程师笔试
三、*易CC语言TTT笔试
第一次霸笔,忘了带简历,还用草稿纸徒手写了一份简历.....1、事物四个特性:
原子性(Atomicity[ætə'mɪsɪti])原型atomic、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)忘了俩,只写了俩,醉了。
2、linux进程查看和调度命令
1)进程查看命令是ps和topps -- 查看前台进程(当前活动进程)
top -- 是动态显示系统状态的信息(正在运行进程)
2)进程调度命令有at,crontab,batch,kill
Kill + 进程号 -- 这个命令是杀死进程,如果杀不死的话,还可以使用Kill -9 + 进程号 强制删除进程
at -- 是设置某一个命令某个时间一次性完成
cron服务,提供定时器的功能,可执行重复性的和周期性的操作
batch:不需要指定时间,自动在系统空闲的时候执行指定的任务。其他用法与at相似
3、执行main函数之前
main函数执行之前主要是初始化系统资源1、设置栈指针。
2、初始化static静态和global全局变量,即data段内容。
3、将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容。
4、运行全局构造器,估计是C++中构造函数之类的吧
5、将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数
至此,我们可以总结出:定义在main( )函数之前的全局对象、静态对象的构造函数在main( )函数之前执行。
4、深拷贝个浅拷贝
1)浅拷贝:
class A { public: A(int _data) : data(_data){} A(){}
private: int data; };
int main() { A a(5), b = a; // 仅仅是数据成员之间的赋值 }
在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
2)深拷贝:
深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。下面举个深拷贝的例子。
5、判断cpu大小端
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
#include <stdlib.h>
int main()
{
int a=0x1234;
char b=*(char*)&a; //char型指针转换
if(b==0x12)
printf("big end\n");
else
printf("little end\n");
return 0;
}
6、数据库操作
1)case函数
from testTb
2)子查询
下面程序的输出结果是( C ) #include <iostream> using namespace std; class Base { public: Base(int i) { cout << i; } ~Base () { } }; class Base1: virtual public Base { public: Base1(int i, int j=0) : Base(j) { cout<< i; } ~Base1() {} }; class Base2: virtual public Base { public: Base2(int i, int j=0) : Base(j) { cout<< i; } ~Base2() {} }; class Derived : public Base2, public Base1 { public: Derived(int a, int b, int c, int d) :mem1(a), mem2(b), Base1(c), Base2(d), Base(a) { cout << b; } private: Base2 mem2; Base1 mem1; }; void main() { Derived objD (1, 2, 3, 4); } A)134122 B)123412 C)14302012 D)143212 下面程序的输出结果是( C )
建立Derived类对象objD(1, 2, 3, 4),首先调用构造函数Derived(int a, int b, int c, int d) : mem1(a), mem2(b), Base1(c), Base2(d), Base(a) { cout << b; } 在构造函数Derived中先调用虚基类Base的构造函数,即Base(a),将a的值1传给i,(Base(int i) { cout << i;)输出i值为1 然后根据声明顺序(class Derived : public Base2, public Base1 )Base2在前,接着调用Base2(d),将d的值传给i,(Base2(int i, int j=0) : Base(j) { cout << i; })输出i值为4,由于Base为虚基类,只有最远端派生类构造函数Derived才能调用虚基类的构造函数,该派生类的其他基类对虚基类构造函数的调用被忽略,所以系统不会做 : Base(j) 再调用Base1(c), 将c的值传给i,(Base1(int i, int j=0) : Base(j) { cout << i; }),输出i值为3,同理系统不做: Base(j) 然后根据对象成员声明顺序(Base2 mem2; Base1 mem1;)先做mem2(b), 即调用构造函数Base2(int i, int j=0) : Base(j) { cout << i; },在Base2构造函数中需要先调用Base构造函数,把j=0传值给i,(Base(int i) { cout << i;)输出i值为0,再将b=2的值传给构造函数Base2中的i,输出i值为2 接着做mem1(a),同mem2(b),调用Base1构造函数时先调用Base构造函数,输出i值为0,再将,a=1的值传给构造函数Base1中的i,输出i值为1 最后做构造函数Derived中的{ cout << b; },输出b值为2 结果:143020128、DNA逆序对
我们以lsfile.sh为例:
2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh
inode 的值是:2408949
文件类型:文件类型是-,表示这是一个普通文件; 关于文件的类型,d 目录;- 普通 ;l 链接
文件权限:文件权限是rwxr-xr-x ,表示文件属主可读、可写、可执行,文件所归属的用户组可读可执行,其它用户可读可执行;
硬链接个数: lsfile.sh这个文件没有硬链接;因为数值是1,就是他本身;
文件属主:也就是这个文件归哪于哪个用户 ,它归于root,也就是第一个root;
文件属组:也就是说,对于这个文件,它归属于哪个用户组,在这里是root用户组;
文件大小:文件大小是7个字节;
访问可修改时间 :这里的时间是最后访问的时间,最后访问和文件被修改或创建的时间,有时并不是一致的
调度什么时候发生?即:schedule()函数什么时候被调用?
1)主动式
当进程需要等待资源等而暂时停止运行时,会把状态置于挂起(睡眠),并主动请求调度,让出cpu。
2)被动式(抢占)
有更高优先级的进程抢占cpu,当有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程 。
慢启动:如果带宽为W,那么经过RTT*log2W时间就可以占满带宽。
1)授权命令 grant,语法格式(SQL语句不区分大小写):
Grant <权限> on 表名[(列名)] to 用户 With grant option
或 GRANT <权限> ON <数据对象> FROM <数据库用户>
2)回收权限 revokeREVOKE <权限> ON <数据对象> FROM <数据库用户名>
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
a+b>c&&b!=c (a=3,b=4,c=5) => (3 + 4 > 5) && ( 4 != 5) => (7 > 5) && (4 != 5) => 7 > 5 为 true 那么就会去比较 4 != 5(&&->如果是false那么就不会去判断后面的条件) => 4 != 5 也为 ture => 表达式的值就为 ture 结果:表达式a+b>c&&b!=c的值为 ture
在网络编程里,网络字节序是big-endian的,而大部分的PC的系统都是X86处理器系列,X86采用的是little-endian,所以需要将
网络数据流转换成本地数据流的话,需要进行字节序的转换。
标准库里提供了hlton()和nthl()两个函数来支持转换。
hston(unsigned short), hlton(unsigned long) 将本地字节序转换为网络字节序
ntohl(unsigned long), ntohs(unsigned short) 将网络字节序转换为本地字节序
int main()
{
printf("%d /n",htons(16));
return 0;
}
得到的结果是4096,初一看感觉很怪。
解释如下,数字16的16进制表示为0x0010,数字4096的16进制表示为0x1000。 由于Intel机器是小尾端,存储数字16时实际顺序为1000,存储4096时实际顺序为0010。因此在发送网络包时为了报文中数据为0010,需要经过htons进行字节转换。如果用IBM等大尾端机器,则没有这种字节顺序转换,但为了程序的可移植性,也最好用这个函数。
举例 :tcp的收发窗口大小为1024Byte,网络的链路带宽是1Mb/s,往返时延RTT是50ms,问最大吞吐率? 带宽1Mb/S=125000 Byte/s Packet =1024+20+20+14+12+8+4=1102Byte 线速的话125000/1102≈113pps 因往返时延50ms,所以1s内packet为1000ms/50ms=20次往返,小于线速113pps,于是最大吞吐率=(1102Byte*20)/125000Byte/s=17.632%
四位数×4=四位数
所以千位没有对万位进位,a=1或2;
又因为整数乘以4的末位不会是1,所以a=2;
d×4末位是2,那么d=3或者8,因为a=2,所以d=8;
2bc8×4=8cb2,百位对千位也没有进位,所以b=0,1,2
因为c×4的末位是偶数,d(8)×4进到十位的数字为3,偶数+3只能是奇数,所以b只能是奇数,b=1;
21c8×4=8c12,
个位8×4的进位是3,结果的十位是1,所以c×4的末位是11-3=8,所以c=2或7;
百位1×4结果是4,加上c×4+3的进位,仍等于c,那么c只能是7