KDXF软件研发笔试

20个选择,10个多选,5个判断,2个编程

1.IP地址4个类别及号段

A类:1~126;1个字节的网络地址和3个字节主机地址组成,网络地址的最高位必须是“0”

B类:128~191;2个字节的网络地址和2个字节的主机地址组成,网络地址的最高两位必须是“10”

C类:192~223;3个字节的网络地址和1个字节的主机地址组成,网络地址的最高三位必须是“110”

D类:224~239之间。用于多点播送.第一个字节以“1110”开始.因此,任何第一个字节大于223小于240的IP地址是多点播送地址

E类:以“11110”开始,为将来使用保留

全零(“0.0.0.0”)地址对应于当前主机.全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址

2.进程三个基本状态:就绪、执行、阻塞

进程三部分组成:程序、数据、PCB(进程控制块)

3.IP地址编码分为:网络号和主机号

4.定义虚函数关键字:visual

5.二叉树插入节点复杂度:最差是O(n),因为不平衡,所以最终会发展成为单链的形式,一条线,所以是O(n)

6. 内存分配方式

动态分配都在堆区:使用 “new” 以及 “malloc” 函数进行内存分配的空间保存在堆中

变量都在栈。

内存分配方式有三种:

[1] 从静态存储区域分配。程序编译时分配好,整个运行期间都存在。例如全局变量, static 变量。

[2] 在栈上创建。由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。

栈内存分配运算内置于处理器的指令集中 ,效率很高,但是分配的内存容量有限

[3] 从堆上分配,亦称动态内存分配 。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定 ,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。若程序员不释放,程序结束时可能由 OS 回收 。分配方式类似于链表。

7. 先序和后序排序确定一颗二叉树(错误)

前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树,只能明确父子关系,不能确定二叉树。 

由二叉树的中序和前序遍历序列可以唯一确定一棵二叉树 ,由前序和后序遍历则不能唯一确定一棵二叉树

8. c++类中不能被是派生类继承的有哪些?

构造函数、拷贝构造函数、赋值函数、析构函数

因为构造函数并没有this这个隐藏参数。构造函数中调用的this,是在构造的过程中、系统分配完成之后才有的。所以构造函数本身并没有继承到下面那个类里面。析构函数的确是可以继承的,甚至可以定义为虚函数,这样用基类指针进行delete的时候也可以正确地调用到派生类的析构函数。派生类的析构函数在执行结束后也会自动调用基类的析构函数。不过析构函数只能通过delete操作符来调用,所以继承关系不算很明显。

9. switch(c)中的c有什么限制

除了整型和字符外 其他的都不行

switch语句后的控制表达式只能是short、char、int、long整数类型和枚举类型,不能是float,double和boolean类型。它经常跟Case一起使用,是一个判断选择代码。其功能就是控制业务流程流转的。

10. 类一定有构造函数和析构函数()

C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。 若没有提供任何构造函数,那么c++自动提供一个默认的构造函数。 

在类定义中可以声明一个析构函数,但只能显示定义一个析构函数,也是唯一的,是不能重载的。也可以不显示定义析构函数,系统会给出默认的析构函数。

11. 线程可共享的内容有哪些?

代码、数据、文件描述符、进程当前目录、进程用户ID

线程独有内容有哪些?

寄存器、堆栈、线程ID、线程信号屏蔽码、错误返回值

12. 编程一:n阶乘末尾的0个数

想到这个问题,有人可能第一反应就是现求出N!,然后再根据求出的结果,最后得出N!的末尾有多少个0。但是转念一想,会不会溢出。

其实,从"那些数相乘可以得到10"这个角度,问题就变得比较的简单了。

N的阶乘可以分解为: 2的X次方,3的Y次方,4的5次Z方,.....的成绩。由于10 = 2 * 5,所以M只能和X和Z有关,每一对2和5相乘就可以得到一个10,于是M = MIN(X,Z),不难看出X大于Z,因为被2整除的频率比被5整除的频率高的多。所以可以把公式简化为M=Z。

方法一:  要计算Z,最直接的方法就是求出N的阶乘的所有因式(1,2,3,...,N)分解中5的指数。然后求和。

int fun1(int n){
    int num = 0;
    int i,j;
    for (i = 5;i <= n;i += 5){
        j = i;
        while (j % 5 == 0){
            num++;
            j /= 5;
        }
    } 
    return num;
}
方法二:Z = N/5 + N /(5*5) + N/(5*5*5).....知道N/(5的K次方)等于0;

公式中 N/5表示不大于N的数中能被5整除的数贡献一个5,N/(5*5)表示不大于N的数中能被25整除的数再共享一个5,以此类推。

int fun2(int n){
    int num = 0;
    while(n) {
        num += n / 5;
        n = n / 5;
    }
    return num;
}
13. 编程二:字符串最长连续数字



展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读