Published on

ARTS 第32周

Authors

Algorithm

package org.nocoder.leetcode.solution;

/**
 * 977. Squares of a Sorted Array
 * <p>
 * Given an array of integers A sorted in non-decreasing order,
 * return an array of the squares of each number, also in sorted non-decreasing order.
 * <p>
 * Example 1:
 * <p>
 * Input: [-4,-1,0,3,10]
 * Output: [0,1,9,16,100]
 * Example 2:
 * <p>
 * Input: [-7,-3,2,3,11]
 * Output: [4,9,9,49,121]
 * <p>
 * <p>
 * Note:
 * <p>
 * 1 <= A.length <= 10000
 * -10000 <= A[i] <= 10000
 * A is sorted in non-decreasing order.
 *
 * @author yangjinlong
 */
public class SquaresOfASortedArray {

    public static void main(String[] args) {
        int[] arr = new int[]{-4, -1, 0, 3, 10};
        sortedSquares(arr);
    }

    public static int[] sortedSquares(int[] A) {
        int[] arr = powArray(A);
        sort(arr, 0, arr.length - 1);
        return arr;
    }

    private static int[] powArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) Math.pow(arr[i], 2);
        }
        return arr;
    }

    private static void sort(int[] arr, int head, int tail) {
        if (head >= tail || arr == null || arr.length <= 1) {
            return;
        }
        int i = head, j = tail, pivot = arr[(head + tail) / 2];
        while (i <= j) {
            while (arr[i] < pivot) {
                ++i;
            }
            while (arr[j] > pivot) {
                --j;
            }
            if (i < j) {
                int t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
                ++i;
                --j;
            } else if (i == j) {
                ++i;
            }
        }
        sort(arr, head, j);
        sort(arr, i, tail);
    }

}

Review

Readme Driven Development

RDD 开发的几个优势

  • 最为重要的一点是,给自己一次重新审视项目,又无需每次为了改变主意而去修改代码而花去开销的机会,例如整体应该如何组织、公用API里到底应该包含哪些东西。还记得第一次写自动化测试代码,意识到揪出全部的错误从而防止那些问题悄悄跑进代码里去吗?在项目真正编码前写一个Readme的感觉是如出一辙的。
  • 为了明确应该实现什么而去写Readme会产生一些副产品,会得到一份写的非常棒的文档。当在项目伊始,也就是兴奋度和动机处于最高的阶段,写一个文档会十分容易。事后再补Readme将是一种绝对的障碍,并且会发现遗漏了许多重要的细节。
  • 如果与一群开发者一起协同工作,将会发现会从Readme收益颇多。如果其他成员在尚未完成项目前便可以读到这份Readme,他们将大可放心的在将与项目有交互的代码上开始工作。如果没有预先定义好的接口,团队只能顺序地编码或者面临重新实现大量代码的窘境。
  • 基于白纸黑字的讨论将会容易的多,而在一个没有任何成文内容的讨论话题上,事情往往会演变成争论不休。把建议的解决方案写下来这样一个简单的行动,代表了一个具体的想法,从而能被讨论,迭代发展下去。

Tip

Docker 容器中centos的编码问题

前几天项目中有个微信提现的BUG,微信端返回“持卡人姓名不正确”,检查了接口调用方式,参数以及种种检查和测试之后,发现同样的代码本地是可以调通的,只有 docker 环境下会出问题,于是把问题定位偏向了编码问题,开始 code review,发现了这样一行代码estr = RSAUtil.encrypt(data.getBytes(), pub, 2048, 11, rsa);,问题基本定位到了,data 是个String,在调用data.getBytes() 方法是并未指定字符集,在开发的本地环境,编码环境已经设置为UTF-8,所以可以编码不会有问题,但是在测试环境上,Docker 的镜像内包含了一个centos,Dockerfile中并未指定系统的字符集,默认为POSIX,所以在data.getBytes() 的时候,会使用POSIX来编码,于是就乱码了。

解决办法有两种:

1、修改代码,指定字符集 data.getBytes("UTF-8")

2、在Dockerfile中添加一行ENV LANG C.UTF-8指定系统的默认字符集

Share

开源项目的选择和使用

项目中经常会使用开源的项目或者库,选择和使用开源项目,我们要关注哪些重要的点,我主要参考了再谈开源项目:如何选择、使用以及二次开发?这边文章,整理了一张图,把几个关键的点记录下来。

开源项目的选择和使用