章节 | 章节 |
---|---|
01 - 计算机组成原理与体系结构 | 07 - 法律法规与标准化与多媒体基础 |
02 - 操作系统基本原理 | 08 - 设计模式 |
03 - 数据库系统 | 09 - 软件工程 |
04 - 计算机网络 | 10 - 面向对象 |
05 - 数据结构与算法 | 11 - 结构化开发与UML |
06 - 程序设计语言与语言处理程序基础 | 12 - 下午题历年真题 |
End - 二周目上午真题 | End – 二周目下午真题 |
End - 临考快速记忆 | Java工程师的进阶之路 |
定义的数据占用多少空间就是空间复杂度
O(n^2)
真题(如下的O小于平均时间复杂度所以错误)
也就相当于一个数组,所以可以直接通过下边快速查询到表中的元素,所以效率高,但是插入和删除会批量移动,所以效率低,简称查询高效率,插删低效率
1、插入元素的代码和时间复杂度
2、删除元素的代码和时间复杂度
3、查找元素的代码和时间复杂度
时间复杂度为O(1),因为这是直接根据数组下边就可以快速查询到对应的元素
1、插入元素的代码和时间复杂度
2、删除元素的代码和时间复杂度
3、查找元素的代码和时间复杂度
真题1(一般没有问最好或者最坏的时间复杂度那就是默认为平均复杂度)
真题2
删除是要找到删除结点的前面一个结点的位置,循环单链表删除是要找到前面一个结点的位置,也就是要遍历链表,但是插入到尾结点后面就不用遍历直接插入就行
真题3
真题4
真题5
真题6
真题7
真题2
真题4(必须先进入abcd,e看情况进入:decba - dceba - dcbea - dcbae)
真题1
真题2
真题3(这题和题1一样,这里用代入求出答案)
真题4
真题5
真题6
真题7
真题8
真题1
真题2(最长相等前后缀+1)
例如abaab,最长相等前后缀是ab,那么就是2+1=3
例如abaaaba,最长相等前后缀是aba,那么就是3+1=4
a:求 “空” 也就是0
aa:求a也就是 0 + 1 = 1
aaa:求aa也就是1+1=2
aaab:求aaa也就是2+1=3
aaaba:求aaab也就是0+1=1
aaabaa:求aaaba也就是1+1=2
aaabaaa:求aaabaa也就是2+1=3
1、顺序存储
2、链式存储
1、先+中
真题6
1、定义
2、构造哈夫曼树
3、概念
4、规范化构造
26个字符可用 2n>=26 n=5位二进制串表示
真题1
叶子节点有n个,度为0的节点数=度为2的节点数+1
节点总数=0度节点数+2度节点数=n+n-1=2n-1
可以是非直接路径比如下图1-4可以通过1-3-4,这样求出来的就是最少
1、深度优先搜索(DFS)
2、广度优先(BFS)
真题3
哈希表表长一般为不大于散列函数且最接近散列函数的质数
Java实现八大排序算法
适用于序列基本上有序
无法归位(元素位置在下一轮可能改变)
public static void insertionSort(int[] arr) {
// 待插入的数为从下标为1开始,因为先把下标为0的固定住了
for (int i = 1; i < arr.length; i++) {
// 循环与前面的有序序列的每个值进行比较,若有序序列的下标小于0则中断循环
for (int j = i - 1; j >= 0; j -= 1) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
{2,1,5,3,7,3,1,3}
){1,1,2,4,5,8,6}
)public static void shellSort(int[] arr) {
for (int step = arr.length / 2; step > 0; step /= 2) {
//核心代码就是插入排序,把所有的一替换成step
for (int i = step; i < arr.length; i++) {
for (int j = i - step; j >= 0; j -= step) {
if (arr[j] > arr[j + step]) {
int temp = arr[j];
arr[j] = arr[j + step];
arr[j + step] = temp;
}
}
}
}
}
真题3
public static void selectionSort(int[] arr) {
// 5个元素只需要选择4次,因为最后一个默认为最大的
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
// 从第二个元素开始比较,找出最小值下标
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
}
大顶堆:将堆顶元素取出作为序列最大值,将堆底元素提到堆顶,在进行一次调整堆,将75作为第二大值。。。(产生递增序列,小顶堆则产生递减序列)
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 首元素为基准值
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int i = left, j = right, pivot = arr[i];
while (i < j) {
// 从右开始找比基准值小的元素
while (i < j && arr[j] >= pivot) j--;
// 将该元素放在最左侧
arr[i] = arr[j];
// 从左开始找比基准值大的元素
while (i < j && arr[i] <= pivot) i++;
arr[j] = arr[i];
}
arr[i] = pivot;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
空间复杂度是log2n
// 分+合 默认值
public static void mergeSort(int[] arr) {
mergeSort(arr, 0, arr.length - 1, new int[arr.length]);
}
// 分+合
public static void mergeSort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
// 向左分解
mergeSort(arr, left, mid, temp);
// 向右分解
mergeSort(arr, mid + 1, right, temp);
// 合并
merge(arr, left, mid, right, temp);
}
}
// 治
public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left; // 左边序列初始索引
int j = mid + 1; // 右边序列初始索引
int t = 0; // temp数组的当前索引
// 1)先把左右序列按顺序填充到temp数组,直到左右序列有一方处理完毕
while (i <= mid && j <= right) {
// 如果左序列的值小于右序列则进行存放并将左序列指针右移
if (arr[i] < arr[j]) {
temp[t] = arr[i];
t++;
i++;
} else { // 如果右序列的值小于等于左序列则进行存放并将右序列指针右移
temp[t] = arr[j];
t++;
j++;
}
}
// 2)把有剩余数据的一边序列全部填充到temp
// 如果左边还有剩余
while (i <= mid) {
temp[t] = arr[i];
t++;
i++;
}
// 如果右边还有剩余
while (j <= right) {
temp[t] = arr[j];
t++;
j++;
}
// 3)将temp数组的元素拷贝回arr
t = 0;
int tempLeft = left;
while (tempLeft <= right) {
arr[tempLeft] = temp[t];
t++;
tempLeft++;
}
}
public class NTest {
public static void main(String[] args) {
queen();
}
static int N = 4;
static int[] q = new int[N + 1];
static int answer = 0; // 方案数
// 检查放入的皇后是否合法
public static boolean check(int j) {
for (int i = 1; i < j; i++) {
if (q[i] == q[j] || Math.abs(i - j) == Math.abs(q[i] - q[j])) {
return false;
}
}
return true;
}
public static void queen() {
// 初始化棋盘
for (int i = 1; i <= N; i++) {
q[i] = 0;
}
int j = 1; // 表示摆放第 j 个皇后
while (j >= 1) { // 防止回溯时溢出
// 让该皇后按列摆放
q[j] = q[j] + 1;
// 判断皇后位置是否合法且不越界
while (q[j] <= N && !check(j)) {
q[j] = q[j] + 1; // 不合法就往下一个位置摆放
}
if (q[j] <= N) {
// 第j个找到合法位置
if (j == N) { // 找到一组解
answer++;
System.out.print("方案" + answer + ": ");
for (int i = 1; i < q.length; i++) {
System.out.print(q[i] + " ");
}
System.out.println();
} else { // 继续摆放
j = j + 1;
}
} else {
// 还原第j个皇后的位置
q[j] = 0;
// 第j个找不到合法位置,回溯到上一个皇后的位置
j = j - 1;
}
}
}
}
方案1: 2 4 1 3
方案2: 3 1 4 2
大概的意思就是如下三图,对递归不了解的再去查查资料
(1 2 3 4) (1 2 3 4)
(1 2 3 4) (1 2 3 4)(1 2) ?
public class NTest02 {
public static void main(String[] args) {
queen(1);
}
static int N = 4;
static int[] q = new int[N + 1];
static int answer = 0;
// 检查放入的皇后是否合法 (true 合法 | false 不合法)
public static boolean check(int j) {
for (int i = 1; i < j; i++) {
if (q[i] == q[j] || Math.abs(i - j) == Math.abs(q[i] - q[j])) {
return false;
}
}
return true;
}
// 打印解决方案
public static void answer() {
answer++;
System.out.print("方案" + answer + ": ");
for (int k = 1; k < q.length; k++) {
System.out.print(q[k] + " ");
}
System.out.println();
}
// 放入皇后
public static void queen(int j) {
for (int i = 1; i <= N; i++) {
q[j] = i; // 每行都循环按列摆放
if (check(j)) { // 不冲突则检查是否摆放完成,否则摆放下一个
if (j == N) { // 摆放完成
answer();
} else { // 摆放下一个
queen(j + 1);
}
}
}
}
}
真题3
真题1
真题1
真题2
视频教程
时空间复杂度O(N x W)
public class Plan {
public static void main(String[] args) {
int N = 4; // 物品数量
int W = 5; // 背包容量
int[] v = {0, 2, 4, 5, 6}; // 物品价值数组
int[] w = {0, 1, 2, 3, 4}; // 物品重量数组
int[][] f = new int[N + 1][W + 1]; // 子问题解数组
for (int i = 1; i <= N; i++) { // 物品编号
for (int j = 1; j <= W; j++) { // 背包容量
if (j >= w[i]) { // 选择当前物品
// (上一个物品的最优解) 比较 (当前物品价值+剩余容量在上一个物品的最优解)
f[i][j] = Math.max(f[i - 1][j], v[i] + f[i - 1][j - w[i]]);
} else { // 不选择当前物品
// 直接使用上一个物品的最优解
f[i][j] = f[i - 1][j];
}
}
}
System.out.println("最优解:" + f[N][W]);
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= W; j++) {
System.out.printf("%d", f[i][j]);
System.out.print(" ");
}
System.out.println();
}
}
}
真题1
真题2
真题6
解析
官方解析