一、碎碎念
最近做的几套电子科技大学820的预测卷的部分题目总结,不得不说这个预测卷还是蛮舒服的。冲冲冲!
二、算法简答题
第一套
题目: 设计一个算法查找一个带头结点单链表倒数第k个位置的结点,要求时间复杂度为 (O (n) ) 。(PS:09年408真题)
🔑:大家可以自己画个表简单计算下就知道了,这个思想在数据结构有点被用烂了。熟能生巧。
定义两个指针变量p和q,初始时指向头结点的下一个结点(链表的第一个结点)的位置。p指针沿着链表移动,当p指针移动到第k个结点时,q指针和p指针同步移动;当p指针移动到最后一个结点时,q指针指示结点为倒数第k个结点。以上过程对链表仅进行一边扫描。
第二套
题目: 给定一个含有n个元素的数组nums和一个目标值target,从nums中找三个元素使得这三个元素的和与target最接近。要求给出算法思路和时间复杂度。
🔑:
算法思路:
先对nums利用快速排序算法进行排序;设要找的三个元素为a,b,c,对于pa,pb,pc三个指针。对a进行枚举:nums[0],nums[1]…,nums[n-3](这里枚举到倒数第三个元素),在每一次枚举过程中:a=nums[i] ( 0 ≤ n ≤ n − 3 ) (0\leq\ n \leq\ n-3) (0≤ n≤ n−3) ,令b=nums[i+1],c=nums[n-1],即pb指向pa的后继,pc指向数组的最后一个元素,用a+b+c来更新pb和pc:
(1) a+b+c=target:返回a+b+c的下标。
(2) a+b+c>target:pc左移一个位置;
(3) a+b+c<target:pb右移一个位置;
每次将新得到的a+b+c的值与target进行比较,如果差的绝对值更小,则保存,直到 ( b ≥ c ) ( b \geq\ c ) (b≥ c),枚举下一个a。
时间复杂度分析:
涉及两层循环,一层枚举a,一个扫描后面的元素,时间复杂度为(O(n)),快排的时间复杂度为(O(nlogn)),所有该算法的时间复杂度为(O(n))。
第三套
题目: 给定一个有序的数组nums[n],其中每个元素都不等,然后给定一个值,要求在数组nums中找到k个不同的与x值最接近的元素(k<n),请设计一个时间复杂度尽量小的算法,要求给出思路。
🔑:
算法思想:
(1)如果x小于等于nums的第一个元素,那么数组的前k个元素即为所求;如果x大于等于nums的最后一个元素,那么数组的最后k个元素即为所求。
(2)其他情况采用二分查找。取与k最接近的元素下标为index,low=index-(k-1),high=index+(k+1),在index左右分别有k个元素,我们需要的k个数在[low,high]中,继续缩小范围:
a:low<0 或 low对于的元素比high对应的元素更接近x,减小low的值
b:high>n-1 或 high对于的元素比low对应的元素更接近x,增加low的值
直到high-low=k,循环终止,得到答案。
时间复杂度:
二分查找:(O(logn)),元素扫描(O(k)),所以算法复杂度为(O(logn+k))。
三、算法设计题
第一套
题目1: 删除带头结点的单链表中的重复元素,如1→8→7→1→8→2→3→2,删除重复元素之后为1→8→7→2- +3.
题目2: 输出二叉树的每-层最后-一个结点的值,输出函数使用Output()。
二叉树结点定义如下:
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
} BITNode,*BiTree;
第二套
题目1: 求一棵二叉树的最小深度。最小深度定义为从根节点到最近的叶子结点的路径上的结点数。
二叉树结点定义如下:
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
} BITNode,*BiTree;
题目2: 给定一个带头结点的单链表,反转单链表的第m个结点到弟n个结点(1≤m≤n≤表长),如:1→2→8→3→7,反转第2个结点到第4个结点后为: 1→3→8→2→7。
链表结点定义如下:
typedef struct BiTNode{
char data;
struct LNode *next;
} LNode,*LinkList;
第三套
题目1: 删除一个有序数组中重复的元素,使得每-一个重复的元素留下两个,并返回数组长度。
题目2: 二叉树中的叶节点分为左叶结点和右叶节点,请用递归的方法输出一棵二叉树中所有左叶结点的值的和。
二叉树结点定义如下:
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
} BITNode,*BiTree;
四、小结
整体来说,电科的题目有些来自408统考以及一些常见的算法题,难度适中。