算法通关村第三关——青铜挑战笔记
前言
全文代码均以Java语言复现,主要为自己学习做记录,如有问题,还请各位大佬们指点指点。
这篇讲解线性表(数组)创建和基本操作。
数组特点
- 线性表其中一种类型是数组,他们都是具有相同特征数据元素的一个有限序列。
- 从语言实现的角度,有两种基本实现方式:一体式和分离式。一体式就是存储表信息的单元与元素存储区以连续的方式安排在一块存储区(C/C++)。分离式表对象只保存与整个表有关的信息,实际数据元素存放在另一个独立的元素存储区里面(Java/Python)。
数组创建
// 创建一个类型为int长度为10的array数组
int array[]=new int[10];
// 动态赋值
int arr[]={2,2,3,5,7};
增加一个元素
public static int addElementSequence(int a[],int size,int ele){
// 问题1:为什么不是size>length?
if(size>=a.length){
return -1;// 已满 无法添加
}
// 标记index
// 问题2. 为什么是index= size
int index = size;
// 1. 确认插入的位置 index
for(int i = 0; i<size;i++){
// 有序数组实现添加数字
if(ele<a[i]){
index=i;
break;
}
}
// 2. 数组元素往右移动
// 从数组最后一个数字开始向右移动
for(int i = size ;i>index;i--){
a[i]=a[i-1];
}
a[index]=ele;
return index;
}
}
- 我们是想从1开始计数,因此个数不是size-1,而是跟长度是相等的。当size等于长度时,就表明数组已经满了,无法在插入数字咯。
- 同理,以为我们认为从1 开始,所以我们默认index初始化从末尾开始,即index=size。
删除指定数字
public static int delete(int a [],int target ,int size){
int index = -1 ;
for( int i = 0;i<size;i++){
if(target==a[i]){
index=i;
break ;
}
}
if(index!=-1){
// 找到指定数字的位置为index
// 从其后一位即index+1的数字 开始进行覆盖操作
// a[i-1]=a[i]
for(int i = index+1;i<size;i++){
// 数组元素往左移动
// 通过覆盖 实现删除功能
a[i-1]=a[i];
}
// 删除个数减一
size--;
}
return size;
}
查找指定数字
/**
* 查找指定数字
* @param a
* @param target
* @return
*/
public static int findNumber(int a[],int target){
for (int i = 0; i < a.length; i++) {
if(a[i]>=target){
return a[i];
}
}return -1;
}
总结
- 其实最难的但也简单,就是增加/删除时,边界的处理问题,我们就“一刀切”,对于此类问题,我们就从一开始计数,即下标从1开始,这样边界问题就不会模糊不清了,就一种情况——从一开始!从一开始!从一开始!(重要的事说三遍!!!)