1. 数据结构与算法入门
1.1 经典算法问题:
汉诺塔
八皇后问题
马踏棋盘
1.2 字符串匹配
1.2.1 暴力匹配
1.2.2 KMP算法
1.3 数据结构和算法重要性
算法是程序灵魂
内存计算框架
1.4 数据结构与算法关系
2. 实际算法问题:
2.1 str.replaceAll( str )
2.1.1 问题:
试写出单链表表示的字符串类以及字符串结点类的定义,并且依次实现它的构造函数,以及计算串的长度,串赋值,判断两串相等,求子串,两串连接,求子串在串中位置等七个成员函数
2.2 其他几个问题:
丢手帕问题
磁盘问题
公交车
画图
球和篮子
扔石头
修路问题,最小路径
最短路径问题
汉诺塔
八皇后
2.3 线性结构与非线性结构
数据与元素一对一的线性关系
顺序存储,元素都是连续的
链式存储,元素是不连续的
数组,队列,链表和栈
2.3.1 非线性结构
二维数组,多维数组,广义表,树结构,图结构
3. 稀疏数组和队列
3.1 稀疏数组的处理方法:
记录数组一共几行几列,有多少个不同的值
把具有不同值的元素的行列记录在一个小规模数组
3.1.1 二维数组转稀疏数组的方法
遍历原始二维数组,保留有效个数
根据sum创建稀疏数组spareArr intsum+1
二维数组的有效数据存入到稀疏数组
3.2 稀疏数组转二维数组:
先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,
读取稀疏数组的后几行数据,并赋值给原始的二维数组
4. 稀疏数组的Java代码实现
package array;
import java.util.ArrayList;
import java.util.List;
/**
* 稀疏数组
* 1. 需要将二维数组转为稀疏数组存储
* 2. 稀疏数组进行保存(文件读写)
* 3. 读取文件恢复稀疏数组(文件读写)
* 4. 将稀疏数组转回二维数组
* @author zhaoxudong
* @title: SpareceArray
* @projectName structAlgorithms
* @description: 稀疏数组
* @date 2019/8/19 14:54
*/
public class SpareceArray {
/**
* 使用稀疏数组
* @param args 数组
*/
public static void main(String[] args) {
int[][] twoArrayConvertSparecArray = twoArrayConvertSparecArray();
// 稀疏数组如何转为二维住
SparecArrayConverttwoArray(twoArrayConvertSparecArray);
}
/**
* 稀疏数组转为二维数组
*/
private static void SparecArrayConverttwoArray(int[][] array) {
// 1. 根据第一行数据还原出二维数组的行与列
int[][] result = new int[array[0][0]][array[0][1]];
for (int i = 1; i < array.length; i++) {
result[array[i][0]][array[i][1]] = array[i][2];
}
printArray(array);
printArray(result);
}
/**
* 稀疏数组转为二维数组的办法
* 1. 创建二维数组,并且加入数据
* 2.
*/
private static int[][] twoArrayConvertSparecArray() {
// 将二维数组转为稀疏数组 初始化为 11 11
int[][] array = new int[8][8];
List list = new ArrayList();
// 在二维数组放两个子
array[4][5] = 2;
array[3][7] = 11;
array[2][3] = 11;
printArray(array);
// 计算有几个有效数据
// 存储有几个有效数据
int sumCount = 0;
sumCount = calcuArrSize(array, sumCount);
// 创建稀疏数组
int[][] spareceArray = new int[sumCount+1][3];
// 第一行为 个数 棋盘的行 棋盘的列
spareceArray[0][0] = array.length;
spareceArray[0][1] = array[0].length;
spareceArray[0][2] = sumCount;
// 稀疏数组存储数据
//count 用于记录是第几个非0数据
int noZeroCount = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if(array[i][j] != 0) {
noZeroCount++;
// 存储第几行 第几列 值为多少
spareceArray[noZeroCount][0] = i;
spareceArray[noZeroCount][1] = j;
spareceArray[noZeroCount][2] = array[i][j];
}
}
}
return spareceArray;
}
/**
* 计算有效数据的个数
* @param array 原有的数组
* @param sumCount 计算个数
*/
private static int calcuArrSize(int[][] array, int sumCount) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if(array[i][j] != 0) {
sumCount++;
}
}
}
return sumCount;
}
/**
* 打印数组的快捷方法
* @param array 数组
*/
private static void printArray(int[][] array) {
System.err.println("-----------------我是分割线-----------------");
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + "\t" );
}
System.out.println();
}
System.err.println("-----------------我是分割线-----------------");
}
}
5. 队列:
5.1 数组模拟队列
5.1.1 思路分析:addQueue
将尾指针 rear + 1 , 表示入队。当 rear == front 表示空队列
如果rear 等于队列 maxSize - 1, 表示队列满,否则可以增加元素
5.1.2 思路分析:re