写点什么

ARTS 第 4 周

用户头像
乌拉里
关注
发布于: 2020 年 07 月 02 日
ARTS 第 4 周

每周完成一个 ARTS:

  • Algorithm: 每周至少做一个 LeetCode 的算法题

  • Review: 阅读并点评至少一篇英文技术文章

  • Tips: 学习至少一个技术技巧

  • Share: 分享一篇有观点和思考的技术文章(一周一篇强度有点大,视情况而定)



Algorithm

本周做了102. 二叉树的层序遍历,我刚开始想的解法是通过递归实现,其实也就是DFS深度遍历。

DFS

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
int storey = 1;
List<List<Integer>> list = new ArrayList<>();
sing(list,storey,root);
return list ;
}
public void sing(List<List<Integer>> list, int storey, TreeNode node) {
if(node==null){
return;
}
List<Integer> currStory;
if (list.size() < storey) {
currStory = new ArrayList<>();
list.add(currStory);
} else {
currStory = list.get(storey - 1);
}
currStory.add(node.val);
list.set(storey-1,currStory);
sing(list,storey+1,node.left);
sing(list,storey+1,node.right);
}
}

还有一种广度遍历的解法,

BFS

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> queue = new ArrayDeque<>();
if(root != null){
queue.add(root);
}
while (!queue.isEmpty()){
int n = queue.size();
List<Integer> level = new ArrayList<>();
for(int i = 0; i<n;i++){
TreeNode node = queue.poll();
level.add(node.val);
if(node.left != null){
queue.add(node.left);
}
if(node.right != null){
queue.add(node.right);
}
}
res.add(level);
}
return res;
}
}



Review

本周阅读的是《Successful Remote Working》,这是极客时间《互联网人的英语私教课》推荐的文章。

要点

1.远程员工首先是要找到家与工作间又明确的区分。

2.成功的远程工程不仅取决于员工,公司和经理应该努力表现透明性建立信任。

3.远程管理者和员工q建起始于良好会议仪式。

4.定期会议的既定日历还有助分布式团队构建。

5.员工与经理间的一对一会议非常重要。

6.制定远程办公战略非常具有挑战性。

7.虽然远程办公对某些员工非常又吸引里,但确实需要权衡取舍。

Tip

在项目中使用到了多线程向List中添加数据,但是ArrayList是线程不安全的,所以我收集了一下解决方案,

1.使用synchronizedList

使用方法

public void test(){
ArrayList<String> list = Collections.synchronizedList(new ArrayList<>());
list.add("a");
}

synochronizedList源码中基本上所有操作都加了锁,适合对数据要求较高的情况,但效率较低。



2.使用CopyOnWriteArrayList

CopyOnWriteArrayLisz是在执行修改操作时,copy一份新的数据进行相关操作,在执行完修改后将原来集合指向新的集合来完成修改操作

源码

private volatile transient Object[] array;
public void add(int index,E element){
final ReentrantLock lock = this.lock;
lock.lock();
try{
Object[] elements = getArray();
int len = elements.length;
if(index > len || index<0)
throw new IndexOutOfBoundsException("Index:"+index+",Size:"+len);
Object[] mewElements;
if numMoved = len - index;
if(numMoved == 0)
Arrays.copyOf(elements,len + 1);
else{
newElements = new Object[len + 1];
System.arraycopy(elements,0,newElements,0,index)
System.arraycopy(elements,index,newElements,0\index+1,numMoved);
}
newElements[index] = element;
setArray(newElements);
}finally{
lock.unlock();
}
}
// 将原数组指向新数组
final void setArray(Object[] a){
array = a;
}



CopyOnWriteArrayList 效率高,适合读多写少的场景,因为在读的时候读的是旧集合,所以它的实时性不高。



share

本周无分享



用户头像

乌拉里

关注

还未添加个人签名 2019.06.11 加入

还未添加个人简介

评论

发布
暂无评论
ARTS 第 4 周