诺瓦笔试2020.8.4

1、Socket通信步骤

  1. 建立一个服务器SeverSocket,并同时定义好SeverSocket的监听端口
  2. SeverSocket调用accept()方法,使之处于阻塞
  3. 创建一个客户机Socket,并设置好服务器的IP和端口
  4. 客户机发出连接请求,建立连接
  5. 分别获取服务器和客户端SeverSocket和Socket的InputStream和OutStream
  6. 利用Socket和SeverSocket进行数据通信

2、第一次出现为两次的字符

void FindFristRepeatTwiceChar(char *str)
{
	if (NULL != str)
	{
		int CountChar[256] = { 0 };
		for (int i = 0; i<strlen(str); i++)
			CountChar[str[i]]++;//下标对应的ASC码值
		for (int j = 0; j<strlen(str); j++)
		{
			if (CountChar[str[j]] == 2)
			{
				cout << "第一次出现两次的字符是:" << str[j] << endl;
				return;
			}
			if (j == strlen(str))
				cout << "不存在这样的字符!\n" << endl;
		}

	}
	return;
}

3、描述数据结构中栈和队列的区别。并说出3个操作

不同点:

1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。

2.队列先进先出,栈先进后出。

3.顺序栈能够实现多栈空间共享,而顺序队列不能。

4.遍历数据速度不同。

栈只能从头部取数据,也就最先放入的需要遍历整个栈最后才能取出来。

队列则不同,它基于地址指针进行遍历,而且可以从头或尾部开始遍历无需开辟临时空间,速度要快的多。

相同点:

1.都是线性结构

2.插入操作都是限定在表尾进行。

3.都可以通过顺序结构和链式结构实现。

4.插入与删除的时间复杂度与空间复杂度上两者均相同。

操作:push(), pop(), empty()

4、cpu在管态和目态下工作有何不同

管态又叫特权态,系统态或核心态。CPU在管态下可以执行指令系统的全集。通常,操作系统在管态下运行。
目态又叫常态或用户态。机器处于目态时,程序只能执行非特权指令。用户程序只能在目态下运行,如果用户程序在目态下执行特权指令,硬件将发生中断,由操作系统获得控制,特权指令执行被禁止,这样可以防止用户程序有意或无意的破坏系统。

不同:当中央处理器处于管态时,可以执行包括特权指令在内的一切机器指令,而在目态下工作不允许执行特权指令。

5、定义构造函数

  1. 使用默认构造函数(类不菱形定义构造函数),能够创建一个类对象,但不能初始化类的各个成员 
  2. 定义带有参数的构造函数,用来初始化数据成员
  3. 定义有默认值的构造函数,用来个数据成员提供默认值
  4. 使用构造函数初始化列表,这个构造函数初始化成员的方式更加紧凑

    ps:创建一个类,c++会给每个类政添加至少三个函数:
      构造函数:创建对象时为对象成员属性赋值   编译器自动调用(用户定义的话就只提供默认拷贝构造)
      析构函数:主要作用在于对象销毁前系统自动调用  执行清理工作
      拷贝构造函数:已经创建完毕的对象初始化一个新对象、值传递的方式给函数参数传值(用户定义的话什么都不提供)

6、解释封装、继承、多态(面向对象三大特征)

       封装是面向对象封装(Encapsulation)是面向对象的三大特征之一,它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。

      继承:子类扩展了父类,获得父类的成员变量和方法,主要用于实现代码重用,节省开发时间。

      ps:封装和继承几乎都是为多态而服务

      多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

7、结构体数组(修改代码)

https://www.cnblogs.com/kkxxzxy/articles/12905932.html

8、dos的缩写

    dos(diskette operation system)磁盘操作系统 

9、描述ARP协议的作用及其工作原理,什么是ARP欺骗攻击?

ARP:地址解析协议。

作用:建立局域网内主机间的MAC地址与IP地址的映射。

工作原理:假设主机A向主机B第一次发送信息,主机A只知道主机B的IP地址但却不知道MAC地址(局域网地址)。

                  主机A先以广播形式发送携带“主机A的MAC地址,主机A的IP地址,请求主机B的IP地址”信息的ARP请求

                  主机B先记下主机A的MAC和IP地址,写入ARP缓存。(  在同一局域网上的所有主机都可以收到这个请求,但只有主机B的IP地址和请求匹配,所以主机B收下这个请求)

                  最后主机B以单播的形式发送携带“主机B的MAC地址,主机B的IP地址”信息的ARP响应,主机A收到后记下主机B的MAC和IP地址,写入ARP缓存。

ARP欺骗攻击:就是在ARP请求阶段,解析到这份ARP请求,然后将自己伪装成主机B,填写一个不存在的MAC地址回复给A,A再将这个假的MAC地址与主机B的IP地址成对写进ARP表中。所以在A的ARP表中B这个条目过期前,A会一直往这个假的MAC地址发送数据,一直不会成功传输。

10、有如下图所示(左)的一棵二叉树, 请设计一种遍历方式,使得按照如下方式(右)输出各个元素:(从下到上, 从右到左输出, 要求每层之间换行, 同行元素之间用tab分割,写出完整代码)

11、深拷贝和浅拷贝的区别

     深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。

ps:

浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,

深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,

使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。

浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。

深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。

12、非虚成员函数和虚成员函数哪个被调用时更快?

非虚成员函数。、

虚函数的地址保存爱虚函数列表里,调用虚函数时根据虚函数在Vtable中的偏移量得到真实函数地址再调用。其实虚函数和废墟函数的地址分别是奇数和偶数,这也是函数调用时虚函数和废墟函数的判别方法。没必要利用多态行为时用虚函数增加内存开销,降低效率。

虚函数:虚函数的作用主要是实现了多态的机制。基类定义虚函数,子类可以重写该函数。

13、windows内存管理的机制以及优缺点

windows 内存管理方式主要分为:页式管理,段式管理,段页式管理

页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页页式管理把内存空间按照页的大小划分成片或者页面,然后把页式虚拟地址与内存地址建立一一对应的页表;并用相应的硬件地址变换机构来解决离散地址变换问题。页式管理采用请求调页或预调页技术来实现内外存存储器的统一管理。其优点是没有外碎片,每个内碎片不超过页的大小。缺点是,程序全部装入内存,要求有相应的硬件支持。例如地址变换机构缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本,增加了系统开销。

段式管理的基本思想是把程序按照内容或过程函数关系分段,每段都有自己的名字。一个用户作业或进程所包括的段对应一个二维线形虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换为实际内存物理地址。其优点是可以分别编写和编译,可以针对不同类型的段采用不同的保护,可以按段为单位来进行共享,包括通过动态链接进行代码共享。缺点是会产生碎片

段页式管理:为了实现段页式管理,系统必须为每个作业或进程建立一张段表以管理内存分配与释放、缺段处理等。另外由于一个段又被划分成了若干个页。每个段必须建立一张页表以把段中的虚页变换成内存中的实际页面。显然与页式管理时相同,页表中也要有相应的实现缺页中断处理和页面保护等功能的表项。段页式管理的段式管理与页式管理方案结合而成的所以具有他们两者的优点。但反过来说,由于管理软件的增加,复杂性和开销也就随之增加了。另外需要的硬件以及占用的内存也有所增加。使得速度降下来

14、给定一个二叉树,且每个节点存储一个值。设计一个算法,实现:对于一个给定的数值, 打印出所有的路径。这条路径不必要开始于或结束语根节点或叶节点。

15、java中接口和抽象类的区别

含有 abstract 修饰符 class 即为抽象类。
接口中的所有方法都必须是抽象的,接口中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。
抽象类中可以有普通成员变量接口中没有普通成员变量
抽象类中可以包含非抽象普通方法接口中的所有方法必须都是抽象的,不能有非抽象的方法
抽象类中的抽象方法的访问权限可以是 public、protected 和默认类型,虽然 eclipse 不报错,但也不能用,默认类型子类不能继承);接口中的抽象方法只能是 public 类型,并且默认即为 public abstract 类型。
一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。

16、为什么类的构造函数一般设置为保护类型

C++类的构造函数一般不应该是私有函数,因为私有函数不能被其他类或者全局函数所使用。而创建C++实例需要调用构造函数。所以如果构造函数是私有函数的话,除了类自己的方法之外,其他类不能构造这个类的实例。

但是,在一些特殊场合,比如不希望其他类能够实例华裔各类,这种情况下会把构造函数定义为私有的或者保护的。就是一个类只有一个实例,为了避免其他类创建多个实例,把构造函数定义为私有的。

17、c++类对象初始化方式总结

第一种情况: XX aa = a;
第二种情况: XX aa(a);
第三种情况: extern fun(XX aa); fun(a)函数调用
第四种情况: XX fun(){...}; XX a = fun();函数返回值的时候

 

广度优先搜索(BFS)与深度优先搜索(DFS)的对比及优缺点

深搜,顾名思义,是深入其中、直取结果的一种搜索方法。


  如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇到终点,他绝不后退一步!因此,他的姐姐广搜总是嘲笑他,说他是个一根筋、不撞南墙不回头的家伙。

      深搜很讨厌他姐姐的嘲笑,但又不想跟自己的亲姐姐闹矛盾,于是他决定给姐姐讲述自己旅途中的经历,来改善姐姐对他的看法。他成功了,而且只讲了一次。从那以后他姐姐不仅再没有嘲笑过他,而且连看他的眼神都充满了赞赏。他以为是自己路上的各种英勇征服了姐姐,但他不知道,其实另有原因……

      深搜是这样跟姐姐讲的:关于旅行呢,我并不把目的地的风光放在第一位,而是更注重于沿路的风景,所以我不会去追求最短路,而是把所有能通向终点的路都走一遍。可是我并不知道往哪走能到达目的地,于是我只能每到一个地方,就向当地的人请教各个方向的道路情况。为了避免重复向别人问同一个方向,我就给自己规定:先问北,如果有路,那就往北走,到达下一个地方的时候就在执行此规定,如果往北不通,我就再问西,其次是南、东,要是这四个方向都不通或者抵达了终点,那我回到上一个地方,继续探索其他没去过的方向。我还要求自己要记住那些帮过他的人,但是那些给我帮倒忙的、让我白费力气的人,要忘记他们。有了这些规定之后,我就可以大胆的往前走了,既不用担心到不了不目的地,也不用担心重复走以前的路。哈哈哈……

深搜优缺点
优点
1、能找出所有解决方案
2、优先搜索一棵子树,然后是另一棵,所以和广搜对比,有着内存需要相对较少的优点
缺点
1、要多次遍历,搜索所有可能路径,标识做了之后还要取消。
2、在深度很大的情况下效率不高

 

  广搜,顾名思义,是多管齐下、广撒网的一种搜索方法


  如果广搜是一个人,那么她一定很贪心,而且喜新厌旧!她从一点出发去旅游,先把与起点相邻的地方全部游览一遍,然后再把与她刚游览过的景点相邻的景点全都游览一边……一直这样,直至所有的景点都游览一遍。

       广搜属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。类似树的按层遍历,其过程为:首先访问初始点Vi,并将其标记为已访问过,接着访问Vi的所有未被访问过可到达的邻接点Vi1、Vi2…Vit,并均标记为已访问过,然后再按照Vi1、Vi2…Vit 的次序,访问每一个顶点的所有未被访问过的邻接点,并均标记为已访问过,依此类推,直到图中所有和初始点Vi有路径相通的顶点都被访问过为止。

广搜优缺点
优点
1、对于解决最短或最少问题特别有效,而且寻找深度小
2、每个结点只访问一遍,结点总是以最短路径被访问,所以第二次路径确定不会比第一次短
缺点
1、内存耗费量大(需要开大量的数组单元用来存储状态)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值