1、数据结构被形式地定义为(D,R),其中D是数据的_ 有限集合___,R是关系的有限集合。
2、数据结构包括数据的__逻辑结构__、数据的__物理结构__和数据的运算三个方面
3、数据结构按逻辑结构可分为两大类,它们分别是__线性的__和_ 非线性的___的
4、线性结构中元素之间存在__一对一__关系,树形结构中元素之间存在_一对多_ 的关系。
5、数据的存储结构可用四种基本的存储方法表示,它们分别是__顺序存储、链式存储、索引存储、散列存储___
6、数据的运算常用的有5种,它们分别是__插入、删除、查找、排序、修改___
7、 一个算法的效率可分为___时间效率___和___空间效率___的内容。
8,线性表、栈和队列都是_线性__结构,可以在线性表的__任意__位置插入和删除元素
9,对于栈只能在栈顶插入和删除元素:对于队列只能在_队尾插入__和___队头___ 删除元素。
10、栈是一种特殊的线性表,允许插入和删除运算的一端称为__栈顶____。不允许插入和删除运算的一端称为__栈底___
11、队列是被限定为只能在表的一端进行插入运算,在表的另一端进行册除运算的__线性表
12、在一个循环队列中,队首指针指向队首元素的__前一个位置___
13、在具有n个单元的循环队列中,队满时共有__n1 _个元素,
14、向栈中压入元素的操作是__先移动栈顶指针后插入元素____
15、从循环队列中删除一个元素时,其操作是__先判断是否队空,后移动队头指针__
16.二叉搜索树的中序遍历结果是(A )
A. 升序序列B. 降序序列C. 任意序列D. 无序序列
17.递归算法的特点是( A)
A. 可以通过循环调用自身来解决问题B. 可以通过条件判断来解决问题
C. 可以通过迭代调用自身来解决问题D. 可以通过选择调用自身来解决问题
18.选择排序的时间复杂度是(D )
A. O(n)B. O(log n)C. O(1)D. O(n^2)
19.哪种数据结构遵循先进先出(FIFO)原则(A )
A. 队列B. 栈C. 链表D. 哈希表
20.广度优先搜索算法使用什么数据结构来遍历图的节点(B )
A. 栈B. 队列C. 数组D. 链表
21.布隆过滤器是一种什么类型的数据结构( A )
A. 概率性B. 确定性C. 有序性D. 无序性
22.最短路径算法Dijkstra和Bellman-Ford都可以用来解决什么类型的问题( C)
A. 最大流问题B. 最小生成树问题C. 单源最短路径问题D. 多源最短路径问题
23.哪种排序算法的时间复杂度是O(nlogn)(B )
A. 快速排序B. 归并排序C. 插入排序D. 希尔排序
24.图是由一组什么和一组什么组成的(A )
A. 顶点,边B. 边,顶点C. 节点,边D. 边,节点
25.希尔排序是一种什么类型的排序算法(A )
A. 插入排序B. 选择排序C. 归并排序D. 快速排序
26.AVL树是一种自平衡二叉搜索树( √ )
27.堆排序是一种基于比较的排序算法( √ )
28.选择排序是一种稳定的排序算法( × )
29.哈希表的查找操作的平均时间复杂度是O(log n)( × )
30.哈夫曼编码是一种无损压缩算法( √ )
分析题:1.请给定一个链表,判断链表中是否有环
public boolean hasCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
return true;
}
}
return false;
}
- 请给定一个排序数组,删除重复的元素,使得每个元素只出现一次,并返回新的长度。
public int removeDuplicates(int[] nums) {
if (nums.length == 0) {
return 0;
}
int i = 0;
for (int j = 1; j < nums.length; j ) {
if (nums[j] != nums[i]) {
i ;
nums[i] = nums[j];
}
}
return i 1;
}
编程题:1.请用Java代码实现一个整型数组,并打印数组中的所有元素。
int[] array = {1, 2, 3, 4, 5};
for (int i = 0; i < array.length; i ) {
System.out.println(array[i]);
}
2.请用Java代码实现一个单链表,并打印链表中的所有节点值。
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
this.next = null;
}
}
ListNode head = new ListNode(1);
ListNode second = new ListNode(2);
ListNode third = new ListNode(3);
head.next = second;
second.next = third;
ListNode current = head;
while (current != null) {
System.out.println(current.val);
current = current.next;
}
简答题:1.什么是二叉树?如何进行二叉树的遍历操作?
- 二叉树是一种每个节点最多有两个子节点的树结构。可以进行前序遍历、中序遍历和后序遍历操作,分别表示先访问根节点、先访问左子树和先访问右子树。
2.什么是链表?如何在链表中进行插入和删除操作?
- 链表是一种动态数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在链表中进行插入操作,可以通过改变节点的指针来实现;进行删除操作,需要调整节点的指针来维持链表的连接性。
3.什么是查找算法?给出两种常见的查找算法和它们的时间复杂度。
查找算法是在数据集中寻找某个特定元素的算法。常见的查找算法有线性查找(时间复杂度O(n))和二分查找(时间复杂度O(log n))
思考题:
应用题:(1)实现一个堆排序算法,对给定的数组进行排序
(1)public void heapSort(int[] nums) {
int n = nums.length;
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(nums, n, i);
}
for (int i = n - 1; i >= 0; i--) {
int temp = nums[0];
nums[0] = nums[i];
nums[i] = temp;
heapify(nums, i, 0);
}
}
private void heapify(int[] nums, int n, int i) {
int largest = i;
int left = 2 * i 1;
int right = 2 * i 2;
if (left < n && nums[left] > nums[largest]) {
largest = left;
}
if (right < n && nums[right] > nums[largest]) {
largest = right;
}
if (largest != i) {
int temp = nums[i];
nums[i] = nums[largest];
nums[largest] = temp;
heapify(nums, n, largest);
}
}
(2)实现一个栈,包含push、pop和getMin(获取栈中最小元素)操作,并保证这些操作的时间复杂度都是O(1)。
(2)class MinStack {
private Stack<Integer> stack;
private int min;
public MinStack() {
stack = new Stack<>();
min = Integer.MAX_VALUE;
}
public void push(int x) {
if (x <= min) {
stack.push(min);
min = x;
}
stack.push(x);
}
public void pop() {
if (stack.pop() == min) {
min = stack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return min;
}
}