数据结构与算法学习笔记01-数组

相关视频: 提取码: n9pe

1 时间复杂度

public  static void test1(int n) {
		//执行一条
		if(n>5) {
			System.out.println("n>5");
		}else if(n>3) {
			System.out.println("n>3");
		}else {
			System.out.println("n<=3");
		}
		//执行1(int i=0)+5(i++)+5(i<5)+5条(syso)
		for(int i=0;i<5;i++) {
			System.out.println("test"+i);
		}
	}
	//时间复杂度:O(n+k)
	public static void test2(int n,int k) {
		for(int i=0;i<n;i++) {
			System.out.println("test");
		}
		for(int i=0;i<k;i++) {
			System.out.println("test");
		}
	}

2 斐波那契数列

package 复杂度;

public class Main {
	public static void main(String[] args) {
	   	System.out.println(fib(8));
	}
	public static int fib(int n) {
        if(n<=1){
            return n;
        }   
        int first = 0;
        int second = 1;
        for(int i=1;i<n;i++){
            int sum = first+second;
            first = second;
            second = sum;
        }
        return second;
    }
}

3 动态数组

  • 1 数组初始化后大小不可改变(栈中存放数组地址,指向堆(为数组开辟的空间))
  • 2 main方法结束后,销毁内部栈中数组(局部变量),指针消失。(当年轻代满以后会回收堆中没有指针指向的内容)
  • 3 this(elements) :调用类内部含有参数的构造函数
  • 4 Integer是int的包装类
  • 5 == 基本数据类型比较:值,引用数据类型比较:对象地址
  • 6 右移 >> 例如:4>>1 相当于除以2(二进制:100 ->010)
  • 7 泛型只能放对象
  • 8 为保证不同对象在数组中所占空间一致,数组里面放的是地址值。
//消除警告
@SuppressWarnings("unchecked")

public class ArrayListDong<E> {
	/**
	 * 元素的数量
	 */
	private int size;
	/**
	 * 所有的元素
	 */
	private E[] elements;
	private static final int DEFAULT_CAPACITY = 10;
	private static final int ELEMENT_NOT_FOUND = -1;
	//初始化数组
	public ArrayListDong(int capaticy) {
		capaticy = (capaticy<DEFAULT_CAPACITY)?DEFAULT_CAPACITY:capaticy;
		//因为所有类都继承自object,所以先new Object数组,再强转
		elements = (E[])new Object[capaticy];
	}
	//无参数则默认大小为10
	public ArrayListDong() {
		//调用有参的构造函数!!!
		this(DEFAULT_CAPACITY);
	}
	
	/**
	 * 清除所有元素
	 */
	public void clear() {
		for (int i = 0; i < size; i++) {
			elements[i] = null;
		}
		//不能用:elements = null; 因为会断掉数组(栈)指向堆的空间,堆内部东西会销毁,每次都需要重新开辟空间。
		size = 0;
	}
	/**
	 * 元素的数量 
	 */
	public int size() {
		return size;
	}
	/**
	 * 是否为空
	 */
	public boolean isEmpty() {
		return size == 0;
	}
	
	/**
	 * 是否包含某个元素
	 */
	public boolean contains(E element) {
		return indexOf(element)!=ELEMENT_NOT_FOUND;
	}
	
	/**
	 * 添加元素到尾部
	 */
	public void add(E element) {
		add(size,element);
	}
	
	/**
	 * 获取index位置的元素
	 */
	public E get(int index) {
		rangeCheck(index);
		return elements[index];
	}
	/**
	 * 设置index位置的元素
	 * @return 历史的元素
	 */
	public E set(int index,E element) {
		rangeCheck(index);
		E old = elements[index];
		elements[index] = element;
		return old;
	}
	
	/**
	 * 在index位置插入一个元素
	 */
	public void add(int index,E element) {
		rangeCheckForAdd(index);
		ensureCapacity(size+1);
		for (int i = size-1; i >= index; i--) {
			elements[i+1] = elements[i];
		}
		elements[index] = element;
		size++;
	}
	
	/**
	 * 删除index位置的元素
	 */
	public E remove(int index) {
		rangeCheck(index);
		E old =  elements[index];
		for (int i = index+1; i < size; i++) {
			elements[i-1] = elements[i];
		}
		elements[--size]=null;
		return old;
	}
	/**
	 * 动态缩容
	 */
	public E removed(int index) {
		rangeCheck(index);
		E old =  elements[index];
		for (int i = index+1; i < size; i++) {
			elements[i-1] = elements[i];
		}
		elements[--size]=null;
		trim();
		return old;
	}
	/**
	 * 裁剪数组
	 */
	private void trim() {
		int capacity = elements.length;
		//元素数量大于数组空间的一半,不缩容
		int newCapacity = capacity>>1;
		if(size>=newCapacity || capacity<=DEFAULT_CAPACITY) return;
		//剩余空间还很多
		E[] newElements = (E[])new Object[newCapacity];
		for (int i = 0; i < size; i++) {
			newElements[i] = elements[i];
		}
		//原数组指向新数组
		elements = newElements;
		System.out.println("缩容:"+capacity+"至"+newCapacity);
	}
	/**
	 * 查看元素的位置
	 */
	public int indexOf(E element) {
		if(element==null) {
			for (int i = 0; i < size; i++) {
				if (elements[i] == null) {
					return i;
				}
				
			}
		}else {
			for(int i=0;i<size;i++) {
				if(elements[i].equals(element)) return i;
			}
		}
		
		return ELEMENT_NOT_FOUND;
	}
	
	/**
	 * 数组转换成字符串
	 */
	@Override
	public String toString() {
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("size=").append(size).append(",[");
		for (int i = 0; i < size; i++) {
			if(i!=0) {
				stringBuilder.append(",");
			}
			stringBuilder.append(elements[i]);
//			if(i!=size-1) {
//				stringBuilder.append(",");
//			}
		}
		stringBuilder.append("]");
		return stringBuilder.toString();
	}
	
	//封装报错
	private void outOfBounds(int index) {
		throw new IndexOutOfBoundsException("Index"+index+",Size:"+size);
	}
	private void rangeCheck(int index) {
		if(index<0||index>=size) {
			outOfBounds(index);
		}
	}
	private void rangeCheckForAdd(int index) {
		if(index<0||index>size) {
			outOfBounds(index);
		}
	}
	
	/**
	 * @Description:保证容量至少有capacity
	 */
	private void ensureCapacity(int capacity) {
		int oldCapacity = elements.length;
		if(oldCapacity>=capacity) return;
		//新容量为旧容量的1.5倍
		int newCapacity = oldCapacity+(oldCapacity>>1);
		E[] newElements = (E[])new Object[newCapacity];
		//将原数组的元素填入新数组
		for (int i = 0; i < size; i++) {
			newElements[i] = elements[i];
		}
		//原数组指向新数组
		elements = newElements;
		
		System.out.println("扩容:"+oldCapacity+"至"+newCapacity);
	}
}
public class Assert {
	public static void test(boolean value) {
		try {
			if(!value) throw new Exception("测试未通过");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
public class DongArray {
	public static void main(String[] args) {
		//正常情况下,创建数组后,数组大小无法改变
//		int arr[] = new int[]{11,22,333};
//		ArrayListDong listDong = new ArrayListDong();
//		listDong.add(99);
//		listDong.add(77);
//		listDong.add(88);
//		listDong.add(66);
//		listDong.add(55);
//		for(int i=0;i<30;i++) {
//			listDong.add(i);
//		}
//		listDong.set(3, 80);
		ArrayListDong<Person> persons = new ArrayListDong<>();
		persons.add(new Person(11, "aa"));
		persons.add(new Person(12, "bb"));
		persons.add(new Person(13, "cc"));
		persons.add(null);
		persons.add(null);
		System.out.println(persons);
		System.out.println(persons.indexOf(null));
//		persons.clear();
		//提醒jvm进行垃圾回收
//		System.gc();
//		ArrayListDong<Integer> ints = new ArrayListDong<>();
//		ints.add(1);
//		ints.add(2);
//		ints.add(3);
//		System.out.println(ints);		
	}
}

public class Person {
	private int age;
	private String name;
	public Person(int age, String name) {
		this.age = age;
		this.name = name;
	}

	public String toString() {
		return "Person [age=" + age + ", name=" + name + "]";
	}
	//对象被销毁之前调用
	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("Person - finalize");
	}
	@Override
	public boolean equals(Object obj) {
		Person person = (Person)obj;
		return this.age == person.age;
	}
}

发布了114 篇原创文章 · 获赞 32 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/moqianmoqian/article/details/104592737