今天晚上考了基础数据结构,把题拿出来跟大家分享一下,希望对大家有一定的帮助!!!
时间复杂度,即执行了多少次,i是从1到n,j是从n到0,又因为这个是for循环的嵌套,所以正确答案D.O(n^2)
首先来看A 线性表即顺序表和链表 正确
B 顺序表必须占用一块连续的内存 无论是逻辑上还是物理上都是连续的 正确
C 链表没有明确的规定 所占内存可连续 可不连续 都可以的 错误
D 链表的实现方式 正确
A.单链表要实现尾删尾插的话,得从头开始遍历,那么时间复杂度就是O(n)
B.单循环链表比起单链表就是多了个指向头节点的尾指针,然后你要实现尾删尾插都得从末尾开始操作,但是它是单循环链表,只能从尾结点指向头节点,而不能从头节点指向尾结点,所以时间复杂度也是O(n)
C.带尾指针的单循环链表 比起B选项多了个尾指针,尾插确实可以省时间,但是尾删的话,你不能从尾指针往回找找到倒数第二个节点(尾删得找到倒数第二个节点进行操作),也就是尾插时间复杂度是O(1) 尾删是O(n)
D.就可以很好的解决前三个选项的问题 时间复杂度嗾使O(1)
A. 单链表和上道题一样的问题,头删O(1) 尾插的话得遍历线性表 时间复杂度O(n)
B. 这个选项和A选项时间复杂度一毛一样,带有头指针的单循环链表尾删不能直接找到最后一个系欸DNA来实现尾插,单循环指的是尾指针指向头指针 头删O(1) 尾插O(n)
C. 双向链表找到最后一个节点还得遍历一遍 头删O(1) 尾插O(n)
D. 尾指针直接找到危机欸但进行尾插O(1) 然后单循环链表直接找到头节点进行头删O(1)
ABD对的 没什么好说的
C的话它其实是写反了,又因为有下标的帮助,所以尾部操作时间复杂度为O(1) 除了尾部之外的操作 得挪动数据
因为栈的特点是先进后主 FILO(first Input Last Output)
然后A选项的话就是a先进去然后,b再进去再出来,就是每次进去一个然后出来,再进去下一个输出就是abcd
B选项就是abcd挨个进去,然后再出来就是dcba了 反过来了
C选项就是ab先进去,b出来,然后再重复A选项的操作,输出就是bcda
D选项的就是b先于a出栈了 因为输入的是abcd,所以D不可能
因为队列的特点和栈刚好相反,它的特点是先进先出(FIFO) 然后它的正确输出是abcd ,然后错误的就是BCD
答案在下图:
这玩意kmp算法中的next数组的求法,就是那个字符串的真子串的个数。
具体求法我在这篇博客中写到了:BF算法的优化----KMP算法
相当于给m和n都遍历了一遍 所以n(n+m)
这个也是kmp算法中的 去看这个就好:KMP算法
这两个题没啥说的,算是常识吧,八大排序中四个稳定四个不稳定
大家可以去看我的数据结构专栏去加深一下印象:数据结构与算法
对于冒泡排序,直接来看代码:
void bubbleSort(int *arr,int len)
{
for(int i = 0 ; i < len -1 ; i++)
{
for(int j = 0 ; j < len -1 -i ; j++)
{
if(arr[j] > arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
上面代码中只有arr[j] > arr[j+1]的时候,才会进行交换,如果次次都需要交换,那么交换次数等于比较次数,然而大多数情况下都是交换次数小于比较次数,所以B选项正确
再来看选择排序:选择排序
链接中有明确的动图来解释选择排序中的比较次数和交换次数
这道题就是背吧,面试有时候会考到的
我们来看一下,节点总数是有规律的,就是((2^n)-1),那么我们将n = 6带进去,答案是63,63 < 100 所以小了,那么将n = 7带进去,答案是127 > 100,那么深度就是7
数据越乱,使用快速排序越有利,数据要是已经排序好的1 2 3 4 5的话,第一遍得遍历4次,第二遍三次,两次,一次,最后总的时间复杂度就是O(n^2),所以数据不是很乱的话,使用快速排序不是很省时间
只想要获取前几个最小值,那么大家应该要想到小顶堆,也就是堆排序按照小顶堆来弄,每一次弄出序列中最小的值,就很符合题意,所以选堆排序!
大家可以去看这篇博客的堆排序,讲的很详细:堆排序
照着上图,可以看出左半边有6个元素,21下标为6,答案为6,6