Dimple在左耳听风ARTS打卡(十六)

  • 2019 年 12 月 26 日
  • 笔记

所谓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

输入:    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进行排序。

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/

本来思路挺好的,用了双指针从前往后和从后往前,可惜跑不起来。但也是奇怪,放进去审核,又是可以通过的,我有点怀疑自己了,哈哈。

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 一个技术技巧

这次分享的是网络优化中的第三篇,这里更新完,后续我找找其他资源了要

移动端监控

  1. 如何监控网络

第一种方法:插桩

为了兼容性考虑,首先想到的还是插桩。360开源的性能监控工具ArgusAPM就是利用Aspect切换插桩,实现监控系统和OkHttp网络库的请求。

第二种方法:Native Hook

网络相关的我们一般会Hook下面几个方法:

  • 连接相关:connect
  • 发送数据相关:send和sendto
  • 接收数据相关:recv和recvfrom

第三种方法:统一网络库

  1. 如何监控流量 应用流量监控的方法非常简单,一般通过TrafficStats类。

iPhone 的无线网络助理、小米和一加的自适应 WLAN它们在检测 WiFi 不稳定时会自动切换到移动网络。那请你思考一下,它们是如何实现侦测,如何区分是应用后台服务器出问题还是 WiFi 本身有问题呢

对于手机厂商来说根本不需要访问一个公网IP的方式,它在底层可以拿到的信息有很多。

  • 网卡驱动层信息。如射频参数,可以用来判断WiFi的信号强度;网卡数据包队列长度,可以用来判断网络是否拥塞
  • 协议栈信息。主要是获取数据包发送、接收、时延和丢包等信息

大网络平台监控

  1. 客户端监控
  2. 接入层监控

接入层的数据监控还是非常有必要的,主要的原因是:

  • 实时性。
  • 可靠性。

接入层应该关心哪些数据呢?一般来说,会比较关心服务的入口和出口流量、服务端的处理时延、错误率等。

  1. 监控报警
  • 实时监控。实时监控的目的是最快速度的发现问题
  • 离线监控。小时或者天级别的监控我们可以扩展出全部的维度来做监控,它的目的是在监控的同时,可以更好地圈出问题的范围。

总结

监控、监控又是监控,很多性能优化工作其实都是“三分靠优化,七分靠监控”。

我们在工作的时候,希望你可以看得更远,从更高的角度去思考问题。多想想如果我能做好这件事情,怎么保证其他人不会犯错,或者让所有人都可以做得更好

爱生活,爱学习,爱感悟,爱挨踢