ARTS 第 3 周

用户头像
乌拉里
关注
发布于: 2020 年 06 月 21 日
ARTS 第 3 周
  • Algorithm: 每周至少做一个 LeetCode 的算法题

  • Review: 阅读并点评至少一篇英文技术文章

  • Tips: 学习至少一个技术技巧

  • Share: 分享一篇有观点和思考的技术文章(一周一篇强度有点大,视情况而定)



Algorithm

本周做反转链表相关的题,记忆最深刻的是 1190. 反转每对括号间的子串我自己解题的时候想到通过用栈来获取每对括号的指针实现翻转。

自己解法,时间复杂度O(n^2)

class Solution {
public String reverseParentheses(String s) {
Stack<Integer> stack = new Stack<Integer>();
char[] numsChar = s.toCharArray();
for (int i = 0; i <s.length() ; i++) {
if (s.charAt(i) =='('){
stack.push(i);
}else if(s.charAt(i) == ')'){
int left = stack.pop();
revsever(numsChar,left+1,i-1);
}
}
StringBuffer sb= new StringBuffer();
for (char c: numsChar)
{
if (c!='('&&c!=')')
sb.append(c);
}
return sb.toString();
}
private void revsever(char[] charArray,int left,int right){
while(left<right){
char tmp = charArray[left];
charArray[left] = charArray[right];
charArray[right] = tmp;
left++;
right--;
}
}
}

然后看到别人有时间复杂度为O(n)的解法,先用栈找出没对括号,将索引存入字典,在第二次便利时将索引的值为括号时,跳转到对应另半个括号的位置,并改变索引移动的方向,最终一次便利就可以完成翻转。

class Solution {
public String reverseParentheses(String s) {
Stack<Integer> stack = new Stack<Integer>();
StringBuffer sb= new StringBuffer();
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
char[] numsChar = s.toCharArray();
for (int i = 0; i <s.length() ; i++) {
if (s.charAt(i) =='('){
stack.push(i);
}else if(s.charAt(i) == ')'){
int left = stack.pop();
map.put(left,i);
map.put(i,left);
}
}
for (int i = 0,d = 1;i<s.length();i+=d)
{
if (s.charAt(i) == '('||s.charAt(i)==')'){
i = map.get(i);
d = -d;
}else {
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}



Review

本周阅读的是《Open Source Benefits to Innovation and Organizational》,这是极客时间《互联网人的英语私教课》推荐的文章。

开源的五大优势:

1.有助于二次创新。

2.团队可以安全的实验并快速试错。

3.开发软件的更好方法。

4.有助于吸引和留住更改好的软件开发人才

5.开源开发协作让开发人员更快的精进。

Tip

本周在看《Effective Java》,学会了Builder模式,在类有多个构造器有多个参数时可以使用,虽然过去在开发中经常在类上面使用注解@Builder 但是并不知道其实现原理原来是这样的。

public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder {
// 必要参数
private final int servingSize;
private final int servings;
// 可选参数
private int calories;
private int fat;
private int sodium;
private int carbohydrate;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) {
calories = val;
return this;
}
public Builder fat(int val) {
fat = val;
return this;
}
public Builder sodium(int val) {
sodium = val;
return this;
}
public Builder carbohydrate(int val) {
carbohydrate = val;
return this;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}



// 创建对象
NutritionFacts cocaCola = new NutritionFacts.Builder(240,8)
.calories(100).sodium(35).carbohydrate(27).build();



Share

我为什么放弃Python

首先,我是如何入的Python的坑。

过去听说Python简单,前景好学的Python,现在两年过去,后悔莫及。

1.Python性能问题,我们的项目时做图像处理的,任务量上去以后,Python性能的问题显现,难以优化,目前的办法是加服务器。

2.Python人工智能,如果想做人工智能的工作,需要花大力气学习数学和C++,做这个和Python语言本身没什么关系。

3.Python web 开发,岗位少并且招聘的往往是小公司,而且要求做全栈(前后端一起人做)。

4.Python 自动化运维,目前最靠谱的就业方向。

5.Python 开发的时候快,过两个月自己都看不懂。

6.Python 适合非程序员学习,不适合作为一门商业化项目的开发语言。

现在想来当初贪图简单选了Python,现在后悔莫及,程序员还是应该专注技术能力提升,不应该追热点。

目前已决定转Java,维护过去Python项目,自己接了个Java的项目做,今年好好学习提升Java技术水平,下个工作直接找Java的工作。



用户头像

乌拉里

关注

还未添加个人签名 2019.06.11 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
我写了两年PHP,今年开始用Java。好好学吧
2020 年 06 月 21 日 19:53
回复
没有更多了
ARTS 第 3 周