java2022-12-28

今天主要学习了栈(FILO),以及集合的相关内容

1、栈

package com.ma1;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;

import javafx.print.Collation;

public class Main {

	public static void main(String[] args) {
		//线性表的一个特殊分支
		//队列:FIFI先进先出(first in first out)
		//栈:FILO
		LinkedList<String> queue = new LinkedList<>();
		//Queue<String> queue = new ArrayDeque<>();
		//Queue的一些API
		queue.add("mayy");
		queue.offer("guoxy");
		
		//System.out.println(queue.get(1));Queue无get方法
		
		System.out.println(queue.poll());
		System.out.println(queue.remove());
		//System.out.println(queue.peek());//为空报null
		System.out.println(queue.element());//为空报错
	}
	
	
	//习题一:滑动窗口的最大值
	//{2,3,4,2,6,2,5,1}
	public ArrayList<Integer> maxInWindows(int [] num, int size) {
		ArrayList<Integer> result = new ArrayList<>();
		LinkedList<Integer> window =new LinkedList<>();
		for(int item : num) {
			if(window.size() < size) {
				window.add(item);
			} else if(window.size() == size) {
				window.poll();
				window.add(item);
			}
			if(window.size() == size) {
				//int max = Collections.max(window);
//				int max = window.get(0);
//				for(Integer i : window) {
//					//max = Math.max(a, b);
//					max = max > i ? max:i;
				result.add(Collections.max(window));
					
				}
//				result.add(max);
//			}
		}
		
		return result;  
	    }
	//习题二:和大于等于K的最短子数组
	public int shortestSubarray (ArrayList<Integer> nums, int k) {
		LinkedList<Integer> list = new LinkedList<>();
		//记录当前队列里面值的和是多少
		int sum = 0;
		//记录和大于k时,队列的长度
		int minLen = -1;
		for(int item : nums) {
//			list.add(item);
//			list.poll();
			if(sum < k) {
				sum = sum + item;
				list.add(item);
			}
			while(sum >= k) {
				int successlen = list.size();
				if(minLen == -1) {
					minLen = successlen;
				} else {
					minLen = minLen < successlen ? minLen : successlen;
				}
				int first = list.pop();
				sum = sum - first;
			}
		}
		return minLen; 
    }

	
}

集合:

package com.ma1;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Set;
import java.util.TreeSet;

public class Test1 {

	public static void main(String[] args) {
		//集合:不一定是线性表,叫做Set,也是collection的子接口
		//光看源码和list很想,但是set和list是有区别的,其区别在于
		//set没有角标。正是因为set没有角标,所以我们得出一个现象
		//set中不能存放相同的两个数据,如果向set中放置两次相同的数据,那么
		//set中只能保存其中一个
		//LinkedList<String> set = new LinkedList();
		//treeset是升序
		//Set<String> set = new TreeSet<>();
		//Set<Student> set = new LinkedHashSet<>();
		Set<Student> set = new HashSet<>();
		set.add(new Student(99,100,"hahah","女认男"));
		set.add(new Student(80,79,"xixixi","男转女"));
		set.add(new Student(75,66,"Alex","摄像机"));
		Student stu =new Student(100,44,"Fox","none");
		set.add(stu);
		
		Student[] stuArr =new Student[set.size()];
		set.toArray(stuArr);
		System.out.println(stuArr[0]);
		
		
		//System.out.println(set.size());
//		for(Student item : set) {
//			System.out.println(item);
//		}
		//for循环迭代器
		
//		Iterator<String> iterator = set.iterator();
//		while(iterator.hasNext()) {
//			System.out.println(iterator.next());
//		}while循环迭代器
		
		
		//Set因为没有角标,所以不能使用通过角标来获取数据的过程
		//于是,不能使用for 循环,只能通过迭代器,来依次获取容器中的内容。
		//2、Set因为没有角标,所以在set当中,同一个对象只能保存一次。
		//(两个equals的对象,只会存在一个)
		
		//3、set因为没有角标,所以不能确定获取数据的顺序和放置数据是一致的
		//其获取数据的顺序和具体的实现是有关系的,不同的实现获取的数据顺序是不一样的
		//HashSet是没有顺序的(其实可以通过较复杂的计算过程,来得出顺序,但是没有价值)
		//LinkedHashSet来获取数据的顺序是放置序
		//TreeSet获得的数据的顺序是升序,但是这里需要注意一下,TreeSet中,只能放置实现了comparable接口的对象。
		
		PriorityQueue<Integer> queue = new PriorityQueue<>();
		queue.add(100);
		queue.add(1);
		queue.add(110);
//		
//		for(int item : queue) {
//			System.out.println(item);
//		}
		
		
		Integer[] arr = new Integer[queue.size()];
		queue.toArray(arr);
		for(int i = 0;i<arr.length;i++) {
			System.out.println(arr[i]);
		}
		
		
		
	}
}

package com.ma1;

public class Student {

	 public int age;
	 public int num;
	 public String name;
	 public String gender;
	 
	 public Student(int age,int num,String name,String gender) {
		 super();
		 this.age = age;
		 this.num = num;
		 this.name = name;
		 this.gender = gender;

	 }
	 
	 public Student() {
		 
	 }
	 
	 @Override
	 public String toString() {
		 return "Student [age = " + age +",num = " + num +",name = " + name + ",gender = " + gender + "]";
		 
	 }
	 
	 public int compareTo(Student o) {
		 return this.age - o.age;
	 }
	 
}

联系的相关习题:

例一:链表中环的入口结点

package com.ma1;

import java.util.HashSet;
import java.util.Set;

//习题链表中环的入口结点
public class ListNode {
	public static void main(String[] args) {
		
	}

	public ListNode EntryNodeOfLoop(ListNode pHead) {
		Set<ListNode> set = new HashSet<>();
		whlie(pHead != null){
			int num = set.size();
			set.add(pHead);
			if(num == set.size()) {
				return pHead;
			}
			pHead = pHead.next;
		}
		return null;
	}

	
}

例二:数据流中的中位数

package com.ma1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.PriorityQueue;

public class Fuu {

	//习题一:数据流中的中位数
	public int findMedianinTwoSortedAray (int[] arr1, int[] arr2) {
        //方法一:
//		PriorityQueue<Integer> queue = new PriorityQueue<>();
//		List<Integer> list = new ArrayList<>();
//		for(int item : arr1) {
//			list.add(item);
//		}
//		for(int item : arr2) {
//			list.add(item);
//		}
//		Collections.sort(list);
//		return list.get(list.size()/2 - 1);
		//方法二:
		if(arr1.length == 0) {
			return 0;
		}
		int firstIndex = 0;
		int secondIndex = 0;
		for(int i = 0;i<arr1.length-1; i++) {
			if(arr1[firstIndex] > arr2[secondIndex]) { 
				secondIndex++;
			} else {
				firstIndex++;
			}
		}
		return Integer.min(arr1[firstIndex], arr2[secondIndex]);
    }
	
}

例三:移动0

//习题二:移动0
	public int[] moveZeroes (int[] nums) {
        int [] result = new int[nums.length];
        int index = 0;
        for(int i= 0;i < nums.length; i++) {
        	if(nums[i] !=0) {
        		result[index] = nums[i];
        		index++;
        	}
        }
        return result;
    }

例四:数据流中的中位数

package com.ma1;
//习题 数据流中的中位数

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.PriorityQueue;
import java.util.TreeSet;

public class Foo {
	public static void main(String[] args) {
		Foo foo = new Foo();
		foo.Insert(5);
//		System.out.println(foo.GetMedian());
		foo.Insert(2);
//		System.out.println(foo.GetMedian());
		foo.Insert(3);
		System.out.println(foo.GetMedian());
	}

	PriorityQueue<Integer> queue = new PriorityQueue<>();

//	private List<Integer> queue = new ArrayList<>();
    public void Insert(Integer num) {
    
    	queue.add(num);
    }

    public Double GetMedian() {
    	//方法一
    	Collections.sort(queue);
//        Integer[] arr = new Integer[queue.size()];
//        queue.toArray(arr);
        System.out.println(Arrays.toString(arr));
//        
//        if(arr.length % 2 == 1) {
//        	return Double.valueOf(arr[arr.length/2]);
//        } else {
//        	double first = arr[arr.length/2];
//        	double second = arr[arr.length/2 - 1];
//        	return (first+second)/2;
//        }
    	//方法二
    	List<Integer> list = new ArrayList<>();
    	list.addAll(queue);
    	Collections.sort(list);
//    	while(queue.size() != 0) {
//    		System.out.println(queue.poll());
//    	}
    	
    	
    	return null;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值