在Java研发工程师招聘中,数据结构与算法是必考的题目,不久看到一篇文章《为什么面试总喜欢考算法题》提到:面试考算法是一个基准点,因为算法是计算机学科中最基础的学科。本着不死也脱层皮的想法就买了本算法书开始啃,虽然其中很多题目我就是想破脑汁也想出来,可我居然能沉浸在这样的状态中自得其乐。“算法虐我千百遍,我仍待它如初恋”。
顺序存储结构
顺序存储结构数据存在内存地址连续的一块区域,数组便是这种存储结构的典型表现。由于是在一块的内存区域,只要确定第一个元素的内存地址,后面的元素就可以在这快区域上随机存取。下面的示意图展示了顺序存储结构在内存中的存储形式:
数组实现顺序存储结构
使用数组实现顺序存储结构的主要操作有:查找数据、插入数据和删除数据,其中插入数据和删除数据是本算法中更为核心的部分,因为在数组中要要插入一个数据,必须把数据往后面移动,而且还要考虑是否会出现数组下标越界的情况。删除操作也是一样,要从一个数组中删除一个数据不是不是一件易事(至少从计算机层面来讲是这样的),每次删除一个数据需要把数据往前面移动。下面请看核心代码实现:
public class ListArray implements List {
//数组容量
private int len = 8;
//数组中元素的个数
private int size;
//数组之间元素的比较策略
private Strategy strategy;
//用于装载数据元素的数组
private Object[] elements;
public ListArray(){
this(new DefaultStrategy());
}
public ListArray(Strategy strategy) {
this.strategy = strategy;
size = 0;
elements = new Object[len];
}
//获取第i位置上元素
public Object get(int i) {
if(i < 0 || i > size){
System.out.println("下标越界,获取失败!");
return null;
}
return elements[i];
}
//在第i个位置插入数据元素e
public boolean i