2020年中兴精选50⾯试题及答案
2020年中兴精选50⾯试题及答案
1.优先队列时间复杂度。
优先级队列⽤堆实现,只是需要构建初始堆,这个时间复杂度是0(n)插⼊和删除只是修改了堆顶和堆底,不需要所有的都排序,只是需要再次调整好堆,因此时间复杂度都是0(log2n).
2.堆的维护时间复杂度。
假如有N个节点,那么⾼度为H=logN,最后⼀层每个⽗节点最多只需要下调1次,倒数第⼆层最多只需要下调2次,顶点最多需要下调H次,⽽最后⼀层⽗节点共有2YH-1) 个,倒数第⼆层公有2、(H-2),顶点只有1(2⼋。)个,所以总共的时间复杂度为s = 1 * 2A(H-1) + 2 * 2A(H-2) + ... + (H-l) * 2A1 + H * 2A0 将H 代⼊后s= 2N - 2 - 10g2(N),近似的时间复杂度就是C(N)o
3.CPU是怎么执⾏指令的?
计算机每执⾏⼀条指令都可分为三个阶段进⾏。即职指令——分析指令——执⾏指令。
取指令的任务是:根据程序计数器PC中的值从程序存储器读出现⾏指令,送到指令寄存器。
分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进⾏译码,分析其指令性质。
mysql insert into 时会有字符集转换吗如指令要求操作数,则寻操作数地址。
计算机执⾏程序的过程实际上就是逐条指令地重复上述操作过程,直⾄谒到停机指令可循环等待指令。
—般计算机进⾏⼯作时,⾸先要通过外部没备把程序和数据通过输⼊接⼝电路和数据总线送⼊到存储器,然后逐条取出执⾏。但⾰⽚机中的程序⼀般事先我们都已通过写⼊器固化在⽚内或⽚外程序存储器中。因⽽⼀开机即可执⾏指令。
下⾯我们将举个实例来说明指令的执⾏E程:
幵机时,程序计算器PC变为。。。。川然活单⽚机在时序电路作⽤下⾃动进⼊执⾏程序过程。执⾏过程实际上就是取出指令(取出存储器中事先存放的指令阶段)和执⾏指令(分析和执⾏指令)的循环过程。
例如执⾏指令:MOV A,#0E0H,其机器码为“74H EOH”,该指令的功能是把操作数E0H送⼊累加器,
0000H单元中已存放74H, 0001H单元中已存放EOH。当单⽚机开始运⾏时,⾸先是进⼊取指阶段,其次序是:
1程序计数器的内容(这时是0000H)送到地址寄存器;
2程序计数器的内容⾃动加1 (变为。。。川);getselected
3地址寄存器的内容(。。。纺)通过内部地址总线送到存储器,以存储器中地址译码电
跟,使地址为。。。釦的单元被选中;
4 CPU使读控制线有效;
5在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总绒被送到指令寄存器。⾄此,取指阶段完成,进⼊译码分析和执⾏指令阶段。
由于本次进⼊指令寄存器中的内容是74H (操作码),以译码器译码后单⽚机就会知道该指令是要将⼀个数送到A累加器,⽽该数是在这个代码的下⼀个存储单元。所以,执⾏该指令还必须把数据(E0H)从存储器中取出送到CPU,即还要在存储器中取第⼆个字节。其过程与取指阶段很相似,只是此时PC已为。。。1⽥指令译码器结合时序部件, 产⽣74H 操作码的微操作系列,使数字E0H从。001H单元取出。因为指令是要求把取得的数送到A 累加器,所以取出的数字经内部数据总线进⼊A累加器,⽽不是进⼊指令寄存器。⾄此,⼀条指令的执⾏完毕。单⽚机中PC="0002H", PC在CPU每次向存储器取指或取数时⾃动加1,单⽚机⼜进⼊下⼀取指阶段。这⼀过程⼀直重复下去,直⾄收到暫停
指令或循环等待指令暂停。
CPU就是这样⼀条⼀条地执⾏指令,完成所有规定。
4.什么函数不能声明为虚函数?
常见的不能声明为虚函数的有普通函数(⾮成员函数)、静态成员函数、内联成员函数、构造函数和友元函数。以下将分别对这只种情况进⾏分析。
php正则表达式注册页面1)普通函数(⾮成员函数)只能overload (重载),不能被override (覆盖),不能被声明为虚函数,因此,编译器会在编
译时绑定函数。
2)静态成员函数不能是虚函数,因为静态成员函数对于每个类来说只有⼀份代码,所有的对象都共享这⼀份代码,它不归某个对象所有,所以,它也没有动态绑定的必要性。
3)内联成员函数不能是虚函数,因为内联函数本⾝就是为了在代码中直接展开,减少函数调⽤花费的代价⽽设⽴的,⽽虚函数⾄为了在继承后对象能够准确地执⾏⾃⼰的动作,这是不可能统⼀的。再说,inline函数在编译时被展开,虚函数在运⾏时才能动态地绑定函数。
4)构造函数之所以不能是虚函数,因为或I造函数本来是为了明确初始化对象成员才产⽣的,然⽽虚函数主要是为了在不完全了解细节的情况下也能正确处理对象。另外,虚函数是在不同类型的对象产⽣不同的动作,现在对象还没有产⽣,如何使⽤虚函数来完成你想完成的动作?
5)友元函数。C++语⾔不⽀持友元函数钓继承,对于没有继承特性的函数没有虚函数的说法。友元函数不属于类的成员函数,不能被继承。所以,友元函数不能是虚函数。
5.在函数内定义⼀个字符数组,⽤gets函数输⼊字符串的
时候,如果输⼊越界,为什么程序会崩溃?
因为gets⽆法截断数组越界部分,会将所有输⼊都写⼊内存,这样越界部分就可能覆盖其他内容,造成程序崩溃。
6.线上CPU爆⾼,请问你如何到问题所在。
1、top命令:Linux命令。可以查看实时的CPU使⽤情况。也可以查看最近⼀段时间的CPU
使⽤情况。
2、PS命令:Linux命令。强⼤的进程状态监控命令。可以查看进程以及进程中线程的当前
CPU使⽤情况。属于当前状态的采栏数据。
3、jstack: Java提供的命令。可以查看某个进程的当前线程栈运⾏情况。根据这个命令的
输出可以定位某个进程的所有线程的当前运⾏状态、运⾏代码,以及是否死锁等
4、pstack: Linux命令。可以查看某个进程的当前线程栈运⾏情况。
7.从innodb的索引结构分析,为什么索引的key长度不能太长?
key太长会导致⼀个页当中能够存放的key的数⽬变少,间接导致索引树的页数⽬变多,索引层次増加,从⽽影响整体查询变更的效率。
8.MySQL的数据如何恢复到任意时间点?
恢复到任意时间点以定时的做全量备份,以及备份増量的binlog⽇志为前提。恢复到任意时间点⾸先将全量备份恢复之后,再此基础上回放増加的binlog直⾄指定的时间点。
9.曹操南下攻打刘备,刘备派关⽻守锦州,关⽻派张飞去守城门。刘备⼜派诸葛亮去向孙权求援。孙权派兵攻打曹操.请画岀UML图.
10.信号的⽣命周期?
信号产⽣-》信号在进程中注册-》信号在进程中的注销-》执⾏信号处理函数
11.信号的产⽣⽅式?
(1)当⽤户按某些终端键时产⽣信号
(2)硬件异常产⽣信号【内存⾮法访问】
(3)软件异常产⽣信号【某⼀个条件达到时】
(4)调⽤kill函数产⽣信号【接受和发送的所有者必须相同,或者发送的进程所有者必须为超级⽤户】(5)运⾏kill命令产⽣信号
12.信号处理⽅式?
(1)执⾏默认处理⽅式
(2)忽略处理
(3)执⾏⽤户⾃定义的函数
13.红⿊树如何插⼊和删除的?
插⼊:
(1)如果⽗节点为⿊⾊,直接插⼊不处理
(2)如果⽗节点为红⾊,叔叔节点为红⾊,则⽗节点和叔叔节点变为⿊⾊,祖先节点
变为红⾊,将节点操作转换为祖先节点
(3)如果当前节点为⽗亲节点的右节点,则以⽗亲结点为中⼼左旋操作
(4)如果当前节点为⽗亲节点的左节点,则⽗亲节点变为⿊⾊,祖先节点变为红⾊, 以
ps自动修图插件
祖先节点为中⼼右旋操作
flex垂直居中删除:
(1)先按照排序⼆叉树的⽅法,删除当前节点,如果需要转移即转移到下⼀个节点
(2)当前节点,必定为这样的情况:没有左⼦树。
(3)删除为红⾊节点,不需要处理,直接按照删除⼆叉树节点⼀样
(4)如果兄弟节点为⿊⾊,兄弟节点的两个⼦节点为⿊⾊,则将兄弟节点变为红⾊, 将
着⾊转移到⽗亲节点
(5)如果兄弟节点为红⾊,将兄弟节点设为⿊⾊,⽗亲结点设为红⾊节点,对⽗亲结
点进⾏左旋操作
(6)如果兄弟节点为⿊⾊,左孩⼦为红⾊,右孩⼦为⿊⾊,对兄弟节点进⾏右旋操作(7)如果兄弟节点为⿊⾊,右孩⼦为红⾊,则将⽗亲节点的颜⾊赋值给兄弟节点,将
⽗亲节点设置为⿊⾊,将兄弟节点的右孩⼦设为⿊⾊,对⽗亲节点进⾏左旋
14.输⼊某班级学⽣的姓名、分数,并对分数进⾏降幕排列
并输岀;
Sinclude using namespace std;
struct Node
{
char name[100]; int score;
Node *next;
void show(Node *head)
{
cout<name?" "<score<
head = head->next;
int linkLen(Node *head)
int len = 0; while(head)
mysql面试题目及答案len++;
head = head->next;
return len;
=linkLen(head); j=len-l; j>0; j--)
Node "tempHead = head;
for(int i=0; i
if(tempHead->score> tempHead->next->score) char tempName[100]; int tempScore;
strcpy(tempName,tempHead->next->name); strcpy(tempHead->next->name,
tempHead->name);
strcpy(tempHead->name, tempName); tempScore = tempHead->next->score; tempHead->next->score = tempHead->score; tempHead->score = tempScore;
int main()
char name[100]; int score;
Node *head = NULL; Node "tail = NULL; scanf("%s %d”, name, while(score != -1) Node *temp = new Node; strcpy(temp->name, name);
temp->score = score;
temp->next = NULL;
if(head == NULL)
{
head = temp; tail = temp;
} else
void sort(Node
*head)
int len for(int
&score);
{
tail->next = temp; tail = temp;
}
scanf("%s %d", name, &score);
sort(head);
show(head);
return 0;
}
15.随即产⽣⼀字符串,每次产⽣的字符串内容、长度都不同3
ffinclude
using namespace std;
int main()
{
〃可见字符的范围为32?126 srand(time(0));
int len = rand()%l。。。;
char *a = new char[len+l]; for(int i=0; i
a[i] = char(rand()%95 + 32);
a[len] = '\Q'; cout<
16.设]和]为两个数组每个都包含n个已排好序的数。请使⽤伪代码给岀⼀个求数组X和Y中所有2n个元素的中位数的O(lgn)时间的算法。
数组X有n个元素,数组Y有n个元素,且都是从⼩到⼤排好的。那么中位数是第(2n+l) /2个元素是哪个。
⼀共有2n的元素,职各⾃数组中间的⼀个第(n-1) /2个元素,设为Xmid和Ymid (下标为。到n-1)
1)n为奇数的时候,对于数组X和数组Y有(n-l)/2个元素在第Xmid和Ymid之前,现在假设a.Xmid>Ymid这个时候如果两个数组有序的排好后,会有⾄少(n-l)/2*2+l(这个1为Ymid) = n个元素在Xmid之前也就是说,这个待寻的中位数也在Xmid之前,也就是说这个中位数不可能在X数组Xmid元素之后,所以可以排除⼀半X数组中的元素。⽽且最多会有(n-l)/2-2 = n-1个元素在Ymid之前,所以这个中位数肯定不会⽐Ymid⼩, 所以不会出现在Y数组Ymid之前,排除⼀半Y中的元素(同理Xmid
了,中位数就是Xmid 了。
2)n为偶数的时候,也取Xmid =X[(n-l)/2]
a.Xmid>Ymid,这个时候各⾃有(n-2)/2个元素在Xmid和Ymid元素之前,那么如果这两个数组排序,会有⾄少(n-2)/2*2+l=n-l个元素在Xmid之前,如果为偶数那么中位数为第(2n+l)/2=n 个元素,这个时候X
mid⾄少为第n个元素,所以这个中位数也不可能出现在Xmid这个元素之后。⾄多会有n-2个元素在Ymid之前,所以中位数肯定在Ymid 之后。同样排除了⼀半的X和Y中的元素。
17.static casto^ynamic casto^onst castojeinterpret cast
。的各⾃作⽤和使⽤环境?
static_cast:能完成⼤部分转换功能,但是并不确保安全
const_cast:⽆法从根本上转变类型,妇果是const,它就依旧是con st,只是如果原对象不是const,可以通过此转换来处理,针对指针和引⽤⽽⾔。
dynamic_cast:针对基类和派⽣类指针和引⽤转换,基类和派⽣类之间必须要继承关系,是安全的
reinterpret_cast:允许将任何指针缱转为其他指针类型,是安全的
18.岀现异常时,try和catch做了什么?
Catch(Ep a)发⽣异常-》建⽴⼀个异常対象-》拷贝⼀个异常对象->catch处理
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论