ARTS第六周

Algorithm

Permutations
Permutations II
排列组合,给定唯一整型数组,返回所有排列。
第一版代码,由于第二个问题唯一结果不能通过改第一版代码解决,看其他人解题思路更换代码

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<Integer> list = new ArrayList<>();
        for(int i=0;i<nums.length;i++) {
            list.add(nums[i]);
        }
        List<List<Integer>> result = new ArrayList<>();
        recurse(new ArrayList<>(), list, result);
        return result;
    }
    
    public void recurse(List<Integer> list, List<Integer> numList, List<List<Integer>> result) {
        if (numList.size() == 0) {
            result.add(list);
        }
        for (Integer item : numList) {
            recurse(addMethod(list, item), subtractMethod(numList, item), result);
        }
    }
    
    public List<Integer> addMethod(List<Integer> list, Integer num) {
        List<Integer> result = new ArrayList<>(list);
        result.add(num);
        return result;
    }
    
    public List<Integer> subtractMethod(List<Integer> list, Integer index) {
        List<Integer> result = new ArrayList<>(list);
        result.remove(index);
        return result;
    }
}

第二版,关键逻辑就是排序之后,重复判断和使用标示判断

public List<List<Integer>> permuteUnique(int[] nums) {
        boolean[] used = new boolean[nums.length];
        List<List<Integer>> result = new ArrayList<>();
        // 排序保证相同元素连续,nums元素唯一则不需要排序
        Arrays.sort(nums);
        recurse(new ArrayList<>(), nums, used ,result);
        return result;
    }

    public void recurse(List<Integer> list, int[] nums, boolean[] used, List<List<Integer>> result) {
        if (list.size() == nums.length) {
            result.add(new ArrayList<>(list));
        }
        int temp;
        for (int i = 0; i < nums.length; i++) {
            if (used[i]) continue;
            temp = nums[i];
            // nums元素唯一则不需要判断
            // 重复判断,i>0保证从第二个元素开始;
            // temp=nums[i - 1]保证连续2个相等,其中nums已经排序了;
            // !used[i - 1]保证上1个元素未用,如果使用了就是其中1个需要的结果(如,1、1、2,到第二个1时,第1个1已经使用是需要的结果)
            if (i > 0 && temp == nums[i - 1] && !used[i - 1]) continue;
            used[i] = true;
            list.add(temp);
            recurse(list, nums, used, result);
            list.remove(list.size() - 1);
            used[i] = false;
        }
    }

Review

java-garbage-collection-3
文中介绍了不同于G1到三种新的gc。

  1. Epsilon(java11)
    只分配不回收,只到耗尽内存、崩溃。作用用来测试系统性能,使用无操作gc,系统客户忽略gc产生开销对系统造成的延迟和吞吐量较少的问题。
  2. ZGC(java11)
    使用64位系统中一种指针着色技术,1个对象会占用更多空间记录额外信息。STW,检查GC roots和局部变量->并行阶段,遍历对象着色指针,标记对象->移动对象。
    ZGC会创建很多thread,可能导致应用饿死。
  3. Shenandoah(java12)
    STW,为并发阶段准备heap对象和扫描GC roots->并发阶段遍历可达不可达对象->STW,完成标记、重新扫描root->并发阶段,最终标记的对象拷贝出去->STW,遍历对象跟新对象引用->STW,通过跟新root跟新引用,最后回收空间。
    相比于ZGC慢点,但是跟稳定,出现时间更长。甚至可以兼容java8

Tip

java线程异常需要重启,java线程中,java线程状态Thread.State中NEW、RUNNABLE、BLOCKED、BLOCKED、BLOCKED、TERMINATED,当线程结束或者异常后,thread处于TERMINATED状态是无法重新启动,需要重新new一个thread启动

##通过观察者实现线程重启
public class MyRunnable extends Observable implements Runnable {

    @Override
    public void run() {
        int i = 1;
        try {
            while (true) {
                doSomething(i);
                i++;
            }
        } catch (Exception ignore) {
        } finally {
            notifyOnEx();
        }
    }

    private void notifyOnEx() {
        super.setChanged();
        super.notifyObservers();
    }

    private void doSomething(int i) throws Exception {
        if(i == 10) throw new Exception("111");
        System.out.println("xxxx=" + i);
        Thread.sleep(1000);
    }

}

public class MyObserver implements Observer {

    private Runnable runnable;

    public MyObserver(Runnable runnable) {
        this.runnable = runnable;
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("重启thread");
        new Thread(runnable).start();
    }
}

Share

实现异步转同步
java管程sychronized

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,702评论 0 7
  • 又是一年秋招季,哎呀妈呀我被虐的惨来~这不,前几阵失踪没更新博客,其实是我偷偷把时间用在复习课本了(雾 坚持在社区...
    tengshe789阅读 2,044评论 0 8
  • GC术语 为了理解ZGC如何匹配现有收集器,以及如何实现新GC,我们需要先了解一些术语。最基本的垃圾收集涉及识别不...
    小王ovo阅读 2,013评论 0 0
  • Java基础 类加载的时机和类初始化的时机(引出tomcat类加载器)JVM和绝大多数用户自定义的类在JVM启动的...
    fanyank阅读 2,281评论 0 33
  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 2,156评论 0 8