目录
练习: 1.两数之和 2.删除有序数组中的重复项
一.数据结构
1.数据结构介绍:
是计算机专业的一门基础学科,研究的是数据如何在计算机中进行组织和存储,使我们可以高效的获取数据和修改数据
2.数据结构可以分成三类:
- 线性结构:数组,队列,栈,链表,哈希表.....
- 树形结构:二叉树,二叉搜索树,AVL树,红黑树,堆,Trie,线段树,并查集…
- 图结构:邻接矩阵,邻接表
!!!数据结构+算法=程序!!!
那么我们将正式进入数据结构与算法的学习~
二.数组
1.数组基础
- 数组是用来存储一组类型相同的数据
- 数组在内存中的空间是连续分配的,创建数组时,要指明数组大小[数组一旦创建好之后,大小是不能改变的]
- 访问数组是通过索引进行访问的[索引从0开始,最大值为arr.length-1]
- 使用索引:获取指定索引位置的值;修改指定索引位置的值;删除数组元素;数组的遍历
常见的错误: NullPointException ArrayIndexOutOfBoundsException2
2. 数组的常用方法
private int size;//数组中元素个数
private int capacity;//数组的容量
private T[] data;//数组中存的数据-----这里用到了泛型T
(1)构造方法
public MyArray(int capacity) {
//判断容积大小,当输入容量小于0时,我们给它固定一个容量,当大于0时,正常赋值
if (capacity <= 0) {
this.capacity = 10;
} else {
this.capacity = capacity;
this.size = 0;
}
this.data = (T[]) new Object[capacity];
//强制类型转换,Object为父类
}
(2)获取数组中实际存放元素个数
public int getSize() {
return this.size;
}
(3)获取容积大小
public int getCapacity() {
return this.capacity;
}
(4)判断数组是否为空
public boolean isEmpty() {
return this.size == 0;
}
(5)向数组中添加元素
public void add(T item) {
this.data[this.size] = item;
this.size++;
}
(6)修改指定位置的值
思路:先对参数(index)进行判断是否在有效范围内,再直接将data数组中所引为index的值改为value
public void modifyValueByIndex(int index, T value) {
if (index < 0 || index >= this.size) {
throw new IllegalArgumentException("Index is invalid");
}
this.data[index] = value;
}
(7)获取指定索引位置的值
public T getvalueByIndex(int index) {
if (index < 0 || index >= this.size) {
throw new IllegalArgumentException("Index is invalid");
}
return this.data[index];
}
(8)查询指定的值在数组中是否存在
思路:首先进行入参判断,然后通过for循环获取索引,存在就返回i,不存在返回-1
注:为什么不返回0呢,是因为0也是一个索引
public int containsValue(T value) {
for (int i = 0; i < this.size - 1; i++) {
if (this.data[i] == value) {
return i;
}
}
return -1;
}
(9)根据索引从数组中删除元素
思路:首先进行入参判断,然后将要删除的值存在devlaue中,当数组的大小小于容量的1/4(防止复杂度震荡)且容量大于零时,可进行缩容
public T removeByIndex(int index) {
if (index < 0 || index >= this.size) {
throw new IllegalArgumentException("Index is invalid");
}
T devlaue = this.data[index];
//将删除元素都后面的元素进行前移,从后往前进行
for (int i = index + 1; i < this.size; i++) {
this.data[i + 1] = this.data[i];
}
this.size--;
//删除元素到一定数量,可进行缩容
if(this.size<this.capacity/4&&this.capacity>0){
resize(this.capacity/2);
}
return devlaue;
}
(10)向数组中指定位置添加元素
思路:首先进行入参判断,然后在用for循环,将要插入位置的后面元素进行后移,这时候需要考虑如果当数组满了后,再进行插入操作就会出现溢出,所以就想到了扩容
public void addindex(int index,T val){
if (index < 0 || index >= this.size) {
throw new IllegalArgumentException("Index is invalid");
}
for (int i =this.size-1 ; i >= index; i--) {
this.data[i+1]=this.data[i];
}
this.size++;
//如果位置不够了可以进行扩容
if(this.size==this.capacity){
resize(this.capacity*2);
}
this.data[index]=val;
- 扩容
private void resize(int newCapacity){
T[]redata=(T[]) new Object[newCapacity];
for (int i = 0; i < this.size; i++) {
redata[i]=this.data[i];
}
this.data=redata;
this.capacity=newCapacity;
}
(11) 根据索引修改值
public void setValByIndex(int index,T val){
if(index<0||index>=this.size){
throw new IllegalArgumentException("Index is invalid.");
}
this.data[index]=val;
}
(12)重写ToString方法
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < this.size; i++) {
sb.append(this.data[i]);
//不是每日一个值输出的时候后面都要加逗号
if (i != this.size - 1) {
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
main函数我就不写了,主要方法就这几个,要学会灵活运用哟~
练习:
力扣-1.两数之和https://leetcode.cn/problems/two-sum/description/
力扣-26.删除有序数组中的重复项https://leetcode.cn/problems/remove-duplicates-from-sorted-array/