所谓ARTS:每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第十六期打卡。
写作课已经进行到一半了,还是那句话,适合自己的才是最好的。或许写作课对有些人来说是好的,也可能对有些人来说是不需要付出的,这个还需要看每个人的想法,想走的路子,适合自己的才是最好的哦。
Algorithm LeetCode算法
合并两个有序数组 (https://leetcode-cn.com/problems/merge-sorted-array/)
题目描述:给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
- 初始化 nums1 和 nums2 的元素数量分别为m 和 n。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m n)来保存 nums2 中的元素。
示例 1:
代码语言:javascript复制输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
方法一:合并后排序
先来给大家看一个从Java角度来说,最最简单的做法,就是使用Java内置的API来搞定。我就不说啦,请看代码。用System.arraycopy进行合并,在用Arrays.sort进行排序。
代码语言:javascript复制public static void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
但是这个时间复杂度稍差,需要O((n m)log(n m)),毕竟在这里没有利用两个数组本身已经有序这个特点来搞。
接下来用的是参考了https://juejin.im/post/5bee5089e51d4538670b00d7其他的方法,我参考了掘金上这个【程序员乔戈里】的方法,使用了双指针的做法,还是蛮赞的。
这里我提一句,其实力扣里有一个官方解答,但是我运行起来的时候,一直都是报错的,尤其是方法二和方法三,不知道是我的方法不对,还是程序本身就是问题,我把地址附上,小伙伴们有兴趣的,可以看下,告诉我答案哦。
地址如下:https://leetcode-cn.com/problems/merge-sorted-array/solution/he-bing-liang-ge-you-xu-shu-zu-by-leetcode/
本来思路挺好的,用了双指针从前往后和从后往前,可惜跑不起来。但也是奇怪,放进去审核,又是可以通过的,我有点怀疑自己了,哈哈。
代码语言:javascript复制public static void merge1(int[] nums1, int m, int[] nums2, int n) {
int[] result = new int[m n];
int i = 0,j = 0,p=0;
while (i < m && j < n) {
if (nums1[i] < nums2[j]) {
result[p ] = nums1[i ];
} else {
result[p ] = nums2[j ];
}
}
if (i != m) {
while (i < m) {
result[p ] = nums1[i ];
}
}
if (j != n) {
while (j < n) {
result[p ] = nums2[j ];
}
}
p = 0;
for(i = 0; i< nums1.length;i ) {
nums1[i] = result[p ];
}
}
Review 阅读并点评至少一篇英文文章
Android Studio Project Marble: Layout Editor (https://medium.com/androiddevelopers/android-studio-project-marble-layout-editor-608b6704957a)
好像连续几周看的都是程序员如何提升自身能力方面的话题,没有像以前一样,分享技术相关的,这次,我又找了篇关于Android Studio 布局编辑器相关的给大家,希望大家能喜欢。
这是 Android Studio 团队发布的一系列博客文章中的第五篇,这些博客文章深入探讨了 Project Marble 的一些细节和幕后故事。(感觉我可以把这五篇都看完,也可以整理成一个系列来分享了)
文中介绍了开发人员在Project Marble 期间进行了以下六大优化布局编辑器:
- 约束可视化和选择
- 约束创造
- 约束删除
- 视觉刷新
- 设备捕捉行为
- 维度的维度资源
并对每一个资源进行了详细的介绍。所以,这里我没法一一解答,给大家一个中文翻译的地址,是我在掘金上看到的,还是蛮好的哦。
【译】Android Studio Project Marble:布局编辑器 (https://juejin.im/post/5d24b7ce6fb9a07ef7109a6c#heading-4)
昨天,和一位老哥聊了聊,还是坚定了我学习Java和Android到底的决心,所以后续我会更多的往这方面的资料分享,提前祝大家周末愉快。
Tip 一个技术技巧
这次分享的是网络优化中的第三篇,这里更新完,后续我找找其他资源了要
移动端监控
- 如何监控网络
第一种方法:插桩
为了兼容性考虑,首先想到的还是插桩。360开源的性能监控工具ArgusAPM就是利用Aspect切换插桩,实现监控系统和OkHttp网络库的请求。
第二种方法:Native Hook
网络相关的我们一般会Hook下面几个方法:
- 连接相关:connect
- 发送数据相关:send和sendto
- 接收数据相关:recv和recvfrom
第三种方法:统一网络库
- 如何监控流量 应用流量监控的方法非常简单,一般通过TrafficStats类。
iPhone 的无线网络助理、小米和一加的自适应 WLAN它们在检测 WiFi 不稳定时会自动切换到移动网络。那请你思考一下,它们是如何实现侦测,如何区分是应用后台服务器出问题还是 WiFi 本身有问题呢?
对于手机厂商来说根本不需要访问一个公网IP的方式,它在底层可以拿到的信息有很多。
- 网卡驱动层信息。如射频参数,可以用来判断WiFi的信号强度;网卡数据包队列长度,可以用来判断网络是否拥塞
- 协议栈信息。主要是获取数据包发送、接收、时延和丢包等信息
大网络平台监控
- 客户端监控
- 接入层监控
接入层的数据监控还是非常有必要的,主要的原因是:
- 实时性。
- 可靠性。
接入层应该关心哪些数据呢?一般来说,会比较关心服务的入口和出口流量、服务端的处理时延、错误率等。
- 监控报警
- 实时监控。实时监控的目的是最快速度的发现问题
- 离线监控。小时或者天级别的监控我们可以扩展出全部的维度来做监控,它的目的是在监控的同时,可以更好地圈出问题的范围。
总结
监控、监控又是监控,很多性能优化工作其实都是“三分靠优化,七分靠监控”。
我们在工作的时候,希望你可以看得更远,从更高的角度去思考问题。多想想如果我能做好这件事情,怎么保证其他人不会犯错,或者让所有人都可以做得更好。
爱生活,爱学习,爱感悟,爱挨踢