package objectarray;
import java.util.Arrays;
public class MyArray {
private int[] arr;
public MyArray() {
arr = new int[0];
}
public int size(){
return arr.length;
}
/**
* 向数组的末尾添加一个元素
* @param target
*/
public void add(int target) {
// 创建一个新的数组,长度为原数组+1
int[] newArr = new int[arr.length+1];
// 原数组复制到新数组中
for(int i =0; i<arr.length; i++) {
newArr[i] = arr[i];
}
// 将新元素添加到末尾
newArr[arr.length] = target;
// 替换原数组
arr = newArr;
}
/**
* 删除数组中指定位置上的元素
* @param index
*/
public void delete(int index) {
// 判断索引是否合法,注意每当操作索引的时候一定不要忘记合法性
if(index < 0 || index > arr.length-1) {
throw new RuntimeException("下标越界!");
}
// 创建一个新的数组,长度为原数组-1
int[] newArr = new int[arr.length-1];
for(int i = 0; i<newArr.length; i++) {
if(i < index) {
newArr[i] = arr[i];
}else {
newArr[i] = arr[i+1];
}
}
arr = newArr;
}
/**
* 取出指定位置上的元素
* @param index
* @return
*/
public int get(int index) {
if(index < 0 || index > arr.length-1) {
throw new RuntimeException("下标越界!");
}
return arr[index];
}
/**
* 在指定的位置处插入数据
* @param index
* @param element
*/
public void insert(int index, int element) {
int[] newArr = new int[arr.length+1];
for(int i = 0; i<arr.length; i++) {
if(i<index) {
newArr[i] = arr[i];
}else {
newArr[i+1] = arr[i];
}
}
// 最后把element插入到index位置处
newArr[index] = element;
arr = newArr;
}
/**
* 替换掉指定位置上的元素
* @param index
* @param element
*/
public void set(int index, int element) {
if(index < 0 || index > arr.length-1) {
throw new RuntimeException("下标越界!");
}
arr[index] = element;
}
/**
* 打印
*/
public void show() {
System.out.println(Arrays.toString(arr));
}
/**
* 线性查找
* @param target
* @return
*/
public int search(int target) {
for(int i = 0; i<arr.length; i++) {
if(arr[i] == target) {
return i;
}
}
// 如果没有找到则返回-1
return -1;
}
/**
* 二分查找
* @param target
* @return
*/
public int binarySearch(int target) {
// 记录开始的位置
int start = 0;
// 记录结束的位置
int end = arr.length-1;
// 记录中间的位置
int middle = 0;
// 循环查找,由于不知道要找多少次才可以找到,所以使用while循环
while(true) {
middle = (start + end)/2;
// 判断中间的这个元素是不是要查找的元素
if(arr[middle] == target) {
return middle;
// 中间的这个元素不是要查找的元素
}else {
// 判断中间的这个元素是不是比目标元素大
if(arr[middle] > target) {
// 调整结束索引为中间索引的前一个索引
end = middle-1;
// 中间的这个元素是不是比目标元素小
}else {
// 调整开始索引为中间索引的后一个索引
start = middle+1;
}
}
// 走到这一步,一定是 start==end的情况都已经检查完了,也就是说二分的只剩下一个数的时候都已经检查完了,说明确实没找到,那就直接返回-1
if(start > end) {
return -1;
}
}
}
}