ATRS第十周打卡

1.Algorithm

  https://leetcode-cn.com/problems/merge-two-sorted-lists/

  

方法 1:递归

想法

我们可以如下递归地定义在两个链表里的 merge 操作(忽略边界情况,比如空链表等):

left{ egin{array}{ll} list1[0] + merge(list1[1:], list2) & list1[0] < list2[0] \ list2[0] + merge(list1, list2[1:]) & otherwise end{array} ight.{list1[0]+merge(list1[1:],list2)list2[0]+merge(list1,list2[1:])list1[0]<list2[0]otherwise

也就是说,两个链表头部较小的一个与剩下元素的 merge 操作结果合并。

算法 我们直接将以上递归过程建模,首先考虑边界情况。 特殊的,如果 l1 或者 l2 一开始就是 null ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1 和 l2 哪一个的头元素更小,然后递归地决定下一个添加到结果里的值。如果两个链表都是空的,那么过程终止,所以递归过程最终一定会终止。

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        }
        else if (l2 == null) {
            return l1;
        }
        else if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        }
        else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }

    }
}

2.Review

  https://link.medium.com/qNt4XAqc0W

3.Tips  

  

@PostMapping("/multiUpload")
@ResponseBody
public String multiUpload(HttpServletRequest request) {
    List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
    String filePath = "/Users/itinypocket/workspace/temp/";
    for (int i = 0; i < files.size(); i++) {
        MultipartFile file = files.get(i);
        if (file.isEmpty()) {
            return "上传第" + (i++) + "个文件失败";
        }
        String fileName = file.getOriginalFilename();

        File dest = new File(filePath + fileName);
        try {
            file.transferTo(dest);
            LOGGER.info("第" + (i + 1) + "个文件上传成功");
        } catch (IOException e) {
            LOGGER.error(e.toString(), e);
            return "上传第" + (i++) + "个文件失败";
        }
    }

    return "上传成功";

}

  

4.Share

  https://www.cnblogs.com/tanshaoshenghao/p/10924205.html

  javah常量池  把经常使用的数据放到内存中,避免重复的创建和销毁,实现数据共享,提高系统性能。

  从jdk1.7后,字符串常量池被实现在Java堆内存中

  String s1 = "hello"; String s2 = new String("hello");

  s1 是先去常量池中找,如果没有在new 放回常量池,s2 直接new 不经过常量池。

  String s1 = new String("hello ") + new String("world");

  现在堆中创建2个对象,在使用 stringBuilder进行拼接,然后产生新的对象 这时变量s1指向新对象"hello world".

  s1.intern();

  这个是去常量池中查询有无该字符串 如果有直接返回 没有,在常量池中注册该变量,然后再返回。

  String s1 = "hello "; String s2 = "world"; String s3 = s1 + s2; String s4 = "hello world"; System.out.println(s3 == s4);

  s3 是用stringbuilder进行拼接 new 出对象 所以s3 != s4

原文地址:https://www.cnblogs.com/panda777/p/10927130.html