笔试算法小题

1.从尚未排序的N名学生的考试分数中挑出排名第K的分数,平均时间复杂度最优可以达到多少?( )
A、O(N*logN)
B、O(NxK)
C、O(N)
D、O(N^2)
(B是 *号 星号显示有问题 不会解决)

答: 在尚未排序的N名学生的考试分数中挑出排名第K的分数,平均时间复杂度最优的算法是使用快速选择(Quickselect)算法,其平均时间复杂度为O(n),最坏时间复杂度为O(n^2)。
快速选择算法的步骤如下:

  1. 选择一个枢轴元素,将整个序列分成3部分:小于枢轴元素的、等于枢轴元素的、大于枢轴元素的。
  2. 判断K落在哪一部分:如果K落在小于枢轴元素的部分,继续在该部分中递归地进行选择;如果K落在大于枢轴元素的部分,继续在该部分中递归地进行选择;如果K落在等于枢轴元素的部分,则返回该元素即可。
  3. 重复上述步骤,直到选出第K个元素。

在快速选择算法中,为了避免最坏情况的发生,需要采取一些优化措施,比如每次选择枢轴元素时随机选择,或者采用三数中值分割法等。
因此,快速选择算法是一种时间复杂度比较优秀的算法,可以在较短的时间内找出第K个分数

7. 以下哪个排序算法是稳定的(C)

A. 快速排序
B. 选择排序
C. 冒泡排序
D. 堆排序

解析:
稳定排序算法:
冒泡排序 插入排序 桶排序 归并排序

不稳定排序算法:
选择排序 希尔排序 堆排序 快速排序

赛马问题

有36匹马,六个跑道,用最少的次数选出最快的前3匹马 CSDN:愤怒的小黄鸭


腾讯面试题:赛马问题【超详细图解】64匹马,8个赛道,找出前4名最少比赛多少场? 知乎:AI有温度



6.请选择正确的描述。( )

A、内存泄露就是指当A程序申请一块内存时,有可能操作系统把B程序的一块内存先交给A程序使用,等A程序结束后再返回给B程序,在内存借用的这段时间内,B程序就产生了内存泄漏。

B、通常来说,在堆上分配内存比在栈上分配内存效率更高

C、静态变量和全局变量是在程序一开始时分配内存的,这部分内存无法回收,直至程序结束

D、当我预先知道待分配内存大小时,我就可以直接在栈上分配内存,只要不超过当前操作系统的可用内存大小,就永远会成功


正确的描述是 B、通常来说,在堆上分配内存比在栈上分配内存效率更高。以下是对每个选项的解释:

A、内存泄露通常是指程序中的一块内存没有被正确释放,使得这部分内存无法再被使用,而不是指内存借用的情况。

B、在堆上分配内存通常需要调用系统函数,而在栈上分配内存只需要移动堆栈指针,所以在大部分情况下,堆上分配内存比栈上分配内存效率更高。

C、静态变量和全局变量在程序加载时会分配内存,程序结束时才会释放,但这部分内存是可以被回收的。

D、在栈上分配内存时,需要预先知道内存大小,而且栈空间通常比较小,所以无法处理较大的内存分配请求。在堆上分配内存时,可以动态地调整内存大小,但需要手动释放内存以免造成内存泄露。同时,操作系统也会限制每个进程可以使用的堆空间大小。


12.以下说法错误的是()

A、1个堆栈可以通过1个数组或者1个单向链表来实现,出栈和入栈的均摊复杂度均为o(1)

B、1个先进先出队列可以通过1个数组或者1个单向链表来实现,出队和入队的均摊复杂度均为o(1)

C、1个堆栈可以通过2个先进先出队列来实现,出栈和入栈的均摊复杂度均为o(1)

D、1个先进先出队列可以通过2个堆栈来实现,出队和入队的均摊复杂度均为o(1)


答案:选择C C是错误的。

C、1个堆栈是不能通过2个先进先出队列来实现出栈和入栈的均摊复杂度均为o(1)的,
因为出栈需要从队列的头部删除元素,而队列本身是先进先出的结构,无法在o(1)的复杂度内删除头部元素。

  如果采用两个队列实现,则需要将一个队列作为存储队列,另一个队列为辅助队列,当进行入栈操作时,将元素添加到存储队列中;
出栈时,将存储队列中的元素依次弹出并添加到辅助队列中,直到存储队列中只剩最后一个元素,然后对这个元素进行出队操作,再将辅助队列中的元素按顺序添加到存储队列中。
  这种方式实现的出栈和入栈操作的均摊复杂度不是常数级别的,而是o(n)级别的。

D、1个先进先出队列可以通过2个堆栈来实现出队和入队的均摊复杂度均为o(1),
  其中一个栈作为一个输入栈,另一个栈作为输出栈,当进行入队操作时,将元素压入输入栈中,当进行出队操作时,
如果输出栈中有元素,则从输出栈中弹出元素,否则将输入栈中的元素全部倒入输出栈中,然后再从输出栈中弹出元素即可。

这种方式可以在常数级别的复杂度内实现入队和出队操作。


操作系统相关

9.虚拟内存的容量只受( )的限制

A、计算机地址位数
B、物理内存的大小
C、数据存放的实际地址
D、磁盘空间的大小

A计算机地址位数。
虚拟内存是指操作系统在内存和硬盘之间提供的一种扩展内存的机制。在虚拟内存中,内存中并不是所有的数据都是实际存放在物理内存中的,而是根据需要进行分页、置换、映射等处理,将部分数据存放在硬盘上。虚拟内存的容量取决于计算机地址位数,它能够处理的最大物理内存容量、磁盘空间大小和一些其他因素。

posted @ 2023-03-24 22:33  专心Coding的程侠  阅读(216)  评论(0编辑  收藏  举报