所谓ARTS:每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第十九期打卡。
在文章开头,想给自己前几天写的一篇文章打个推广,这篇文章是告诉我们如何更好地去做好一件事,那就是不停地给自己做减法减法减法,每次只做好一件事,那就是最重要的事。
该篇文章还上了CSDN的首页推广,给很多小伙伴产生了共鸣,所以也请没看过的读者可以移步去看下哦。《成就更好的自己,就是不停地做减法》
Algorithm LeetCode算法
将有序数组转换为二叉搜索树 (https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/)
题目描述:将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。
示例 1:
给定有序数组 [-10,-3,0,5,9]
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树
代码语言:javascript复制输入:
0
/
-3 9
/ /
-10 5
代码语言:javascript复制
在介绍解法之前,首先我们先来了解下什么是二叉搜索树。
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
- 任意节点的左、右子树分别为二叉查找树;
- 没有键值相等的节点
而且,题目中说明了,是一个升序数组,那么在二叉树中中序遍历输出的就是升序数组。
根据中序遍历加前序遍历或者中序遍历后序遍历来还原一棵树。前序(后序)遍历是为了提供根节点。然后我们根据根节点,就可以了递归的生成左右子树了。
因为是平衡二叉树,所以只要把根节点选为数组的中点就好了。找到根节点,然后把数组一分为二,进入递归,就迎刃而解啦。
代码语言:javascript复制public static void main(String[] args) {
int[] nums = {-10,-3,0,5,9};
TreeNode treeNode = sortedArrayToBST(nums);
System.out.println(treeNode);
}
public static TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBST(nums,0,nums.length);
}
public static TreeNode sortedArrayToBST(int[] nums,int start,int end) {
System.out.println("start = " start " end = " end);
if (start == end) {
return null;
}
int mid = (start end) >>> 1;
System.out.println("mid = " mid " start = " start " end = " end);
TreeNode root = new TreeNode(nums[mid]);
root.left = sortedArrayToBST(nums, start, mid);
System.out.println("start = " start " end ====================== " end);
System.out.println("mid = " mid " end = " end);
root.right = sortedArrayToBST(nums, mid 1, end);
return root;
}
当然,这里还有多于一种的解决方案,还有通过栈、通过队列的方式来解决。小编也是参考了课后的优秀题解,所以推荐大家前往https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-24/这里查看。当然,阅读原文处已经把链接加上了,可以直接过去哦。
Review 阅读并点评至少一篇英文文章
My first experience with Kotlin Native (https://link.juejin.im/?target=https://medium.com/@champigny.florent/my-first-experience-with-kotlin-native-988e96f26657)
今天我们来了解下Kotlin,这是一位外国友人在Medium上发表的题为《My first experience with Kotlin Native》。
文章篇幅还是有点长的,让我看的很辛苦。我这个英语水平,真的是太累了,所以,英语学习很重要呢。
作者记录了自己如何成功创建第一个Android和iOS兼容模块,以及如何将其集成到实际应用程序中。
分别是:
- Kotlin可以编译到任何平台
- 我是如何创建我的多平台项目的
- 多平台项目如何
- 生成.frameworks
- 了解Kotlin类型
- 我可以将常用模块放入什么
- 特定于平台的库实施
- 用Kotlin写iPhone代码
- 注入特定于平台的实现
- 创建Android应用程序
- 最后,创建我的XCode应用程序
- 我对Kotlin-Native看法
这么多内容,看的我真的是,不过也从中学会了部分Kotlin和Native的关联,看完之后,还可以和之前的Java和Native的做下对比。
因为Kotlin作为谷歌力推的一个Android编写语言,势必会有一个更好的发展。
作者通过自己一步步的实践,来总结Kotlin-Native,是一个很好的学习方式,有条件的同学可以去看看他的具体过程,感受下这一份心路历程,在技术学习的道路上,走的更好。
Tip 一个技术技巧
在之前学习《Android开发高手课》的时候,还学会了一个如何实现高可用的上报组件,并做了部分总结。这里挑选出部分精华来分享。
究竟什么是“高可用”的上报组件?我认为至少需要达到三个目标:
- 数据不会丢失。数据不会由于应用崩溃、被系统杀死这些异常情况而导致丢失
- 实时性高。无论是前台进程还是后台进程,所有的数据都可以在短时间内及时上报
- 高性能。这里主要有卡顿和流量两个维度,应用不能因为上报组件的CPU和I/O过度占用导致卡顿,也不能因为设计不合理导致用户的流量消耗过多。
- 采样模块
采样还需要满足三个标准。
- 准确性。如果配置了1%的采样比例,需要保证某一时刻只有1%的用户会上报这个数据
- 均匀性。如果配置了1%的采样比例,每天都会更换不同的1%用户来上报这个数据。
- 切换的平滑性。用户的切换需要平滑,不能在同一时间例如12点,所有用户同时切换,这样会导致后台数据不连贯。
- 存储模块
- 上报模块
- 容灾模块
数据自监控
我们怎样确保上报组件的数据可靠性和实效性呢?答案依然是监控,我们需要建立一套完善的自监控体系,为后续进一步优化提供可靠的数据支撑。
- 质量监控
- 容灾监控
Share 一篇有观点和思考的技术文章
设计模式走起来。
公众号地址: 设计模式之命令模式(二)