//数组的创建方式,默认值为0
int[] array1 = new int[10];
//数组初始化
int[] array2 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int[] array3 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
查找一个元素
- 为什么数组的题目特别多呢,因为很多题目本质就是查找问题,而数组是查找的最佳载体。很多复杂的算法都是为了提高查找效率的,例如二分查找、二叉树、红黑树、B+树、Hash和堆等等。另一方面很多算法问题本质上都是查找问题,例如滑动窗口问题、回溯问题、动态规划问题等等都是在寻找那个目标结果。
- 这里只写最简单的方式,根据值是否相等进行线性查找,基本实现如下:
/**
* @param size 已经存放的元素个数
* @param key 待查找的元素
* @return 返回元素位置索引
*/
public static int findByElement(int[] arr, int size, int key) {
for (int i = 0; i < size; i++) {
if (arr[i] == key) {
return i;
}
}
return -1;
}
增加一个元素
增加和删除元素是数组最基本的操作,看别人的代码非常容易,但是自己写的时候经常bug满天飞。能准确处理游标和边界等情况是数组算法题最基础重要的问题之一。所以务必自己亲手能写一个才可以,不要感觉挺简单就不写,其中涉及的问题在所有与数组有关的算法题中都会遇到。
面试冒汗时别怪没提醒!!!!
将给定的元素插入到有序数组的对应位置中,我们可以先找位置,再将其后元素整体右移,最后插入到空位置上。这里需要注意,算法必须能保证在数组的首部、尾部和中间位置插入都可以成功。该问题貌似一个for循环就搞定了,但是如果面试直接让你写并能正确运行,我相信很多人还是会折腾很久,甚至直接会挂。因为自己写的时候会发现游标写size还是size-1,判断时要不要加等于等等,这里推荐一种实现方式。
/**
* @param arr
* @param index 要插入位置的索引,从0开始
* @param element 要插入的元素
* @return
*/
public static int addByElementSequence(int[] arr, int index, int element) {
if (index > arr.length - 1) {
return -1;
}
for (int i = arr.length - 1; i > index; i--) {
arr[i] = arr[i - 1];
}
arr[index] = element;
return index;
}
删除一个元素
对于删除,不能一边从后向前移动一边查找了,因为元素可能不存在。所以要分为两个步骤,先查是否存在元素,存在再删除。
这个方法和增加元素一样,必须自己亲自写才有作用,该方法同样要求删除序列最前、中间、最后和不存在的元素都能有效,下面给一个参考实现:
/**
* @param arr
* @param size 数组有效个数
* @param key 待删除元素
* @return
*/
public static int removeByElement(int[] arr, int size, int key) {
int index = findByElement(arr, size, key);
if (index == -1) {
return -1;
}
for (int i = index; i < size - 1; i++) {
arr[i] = arr[i + 1];
}
return --size;
}