- Published on
ARTS 第32周
- Authors
- Name
- Jason Yang
- @yangjinlong86
- Algorithm:977. Squares of a Sorted Array
- Review: Readme Driven Development
- Tip: Docker 容器中centos的编码问题
- Share: 开源项目的选择和使用
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
开源项目的选择和使用
项目中经常会使用开源的项目或者库,选择和使用开源项目,我们要关注哪些重要的点,我主要参考了再谈开源项目:如何选择、使用以及二次开发?这边文章,整理了一张图,把几个关键的点记录下来。