- Published on
ARTS 第4周
- Authors
- Name
- Jason Yang
- @yangjinlong86
Algorithm
Median of Two Sorted Arrays
package org.nocoder.leetcode.solution;
import java.util.Arrays;
/**
* 4. Median of Two Sorted Arrays
* <p>
* There are two sorted arrays nums1 and nums2 of size m and n respectively.
* <p>
* Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
* <p>
* You may assume nums1 and nums2 cannot be both empty.
* <p>
* Example 1:
* <p>
* nums1 = [1, 3]
* nums2 = [2]
* <p>
* The median is 2.0
* <p>
* Example 2:
* <p>
* nums1 = [1, 2]
* nums2 = [3, 4]
* <p>
* The median is (2 + 3)/2 = 2.5
*
* @author jason
* @date 18/7/27.
*/
public class MedianofTwoSortedArrays {
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
// 创建一个新数组 a, 存放nums1和nums2的元素
int[] a = new int[m + n];
for (int i = 0; i < m; i++) {
a[i] = nums1[i];
}
for (int j = 0; j < n; j++) {
a[m + j] = nums2[j];
}
// 数组a排序
Arrays.sort(a);
double result;
int len = a.length;
if (len == 1) {
return a[0];
}else if (len == 2){
return (a[0] + a[1]) / 2.0;
}
if (len % 2 == 0) {
// 数组a的长度为偶数时,取中间的两个值,数组下标取 length/2 - 1, length/2
result = (a[(len / 2 -1)] + (a[len / 2])) / 2.0;
} else {
// 数组a的长度为基数时,取最中间的一个值返回,数组下标取 length%2
result = a[Math.round(len / 2)];
}
return result;
}
public static void main(String[] args) {
int[] nums1 = new int[]{};
int[] nums2 = new int[]{1,2,3,4,5};
double result = findMedianSortedArrays(nums1, nums2);
System.out.println(result);
}
}
Review
Docker for beginners
https://docker-curriculum.com/
公司最近刚好在搞CI和CD,初步选择了Docker + Jenkins pipline 来配置自动化流程。这篇文章是耗子叔在极客时间专栏《程序员练级攻略(2018):容器化和自动化运维》文中推荐的入门Docker的文章,对docker的基本概念和和入门操作讲的很到位,很适合跟着搭一遍环境初步感受一下docker。文章中对docker run、docker pull、 docker images、docker ps、docker rm命令都给出了示例,并根据Dockerfile来创建Docker镜像,演示了在AWS上怎么运行Docker应用、多容器的环境、Docker Network,Docker Compse等,使用Elastic Container 等。我在实际操作中也参考了《Docker Practice》、《第一本Docker书》,私有镜像仓库使用nexus3来搭建。跟着操作下来,对docker有了初步的认识。
Best practices for writing Dockerfiles
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ 啃英文文章的速度还是非常慢,英文词汇量很小,边查词边理解内容,啃下来感觉还是很吃力,继续努力吧!
- Create ephemeral containers
- Understand build context
- Pipe Dockerfile through stdin
- Exclude with .dockerignore
- Use multi-stage builds
- Don’t install unnecessary packages
- Decouple applications
- Minimize the number of layers
- Sort multi-line arguments
- Leverage build cache
Tip
Canal 找不到binlog问题分析
项目中使用了阿里的canal,主要用来实时往统计相关表里更新数据,使用的1.0.22版本,经常会抛出binlog找不到的异常,难过的是之前异常的log被误删,排查起来很吃力,最终决定先升级到1.0.24版本,观察一段时间看看情况。排查过程中也学习到了一些mysql bin log相关的知识。
- https://github.com/alibaba/canal
- canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
- mysql master收到dump请求,开始推送binary log给slave(也就是canal)
- canal解析binary log对象(原始为byte流)
meta.dat
中记录的是客户端最后一次ack
的binlog信息- 如果删除了
meta.dat
记录中对应的的binlog文件,并且此时重新启动canal server,会HY000抛异常,提示找不到对应的binlog,解决办法是删除meta.dat
- 使用
purge master logs before
语句无法删除当前正在使用的binlog reset master
可以清空所有的binlog文件,并新生成一个从1开始计数的binlog文件- Connection reset by peer
-- 查看bin log
show binary logs;
-- 新生成一个binlog文件
flush logs;
-- 查看binlong清理时间
show variables like 'expire_logs_days'
-- 删除指定日期之前的binlog
purge master logs before'2018-07-25 13:29:59';
Share
本周的 Share
聊一些跟技术本身不相关的吧,主题是日常学习时间的安排。
对于我这个夜猫子型的人来说,早晨起床看书学习是一件很痛苦的事情,效率极低,所以很多时候是老婆孩子睡觉了以后,我再看书学习、写写程序,一般是1、2点睡觉,有时debug到3、4点。我很享受这种感觉,夜晚无干扰的coding,思路很清晰,效率很高,我初中背单词就是晚上背,然后第二天很自信的拿到高分的单词听写成绩,哈哈。
我家小孩刚刚10个月,双方父母都在工作也比较远,所以我媳妇儿全职带孩子,真的很累啊,更心疼我媳妇儿,没办法,终究要经历这一过程。下班回家陪我儿子玩,小孩睡的也晚,非得闹腾到11-12点才肯睡觉。之后的时间就可以任我嗨了,可是有的时候也困得要命,喝咖啡也不管用,扛不住就只能去睡了。
这几次的ARTS,我自己是很不满意的,因为连着两次都是短时间突击出来的,更像是在完成任务。我更希望能通过解决日常工作的问题和工作积累中就把Review、Tip、Share给完成,花2个小时写两道leetcode算法题、2个小时整理文档。为了能达到轻松完成ARTS,我修改了日常worklog的模板,把遇到的问题及解决办法也一并记录下来,包括查了哪些资料,链接也贴上去,供每周ARTS的内容参考。希望通过这份热忱和不断的坚持,不断的提高自己。