- Published on
ARTS 第12周
- Authors
- Name
- Jason Yang
- @yangjinlong86
小伙伴们中秋节快乐!终于可以放松几天,这两天带着老婆孩子玩疯了,满成都到处跑,当然
ARTS
绝不能落下,只是晚到了一天。(算法题做的很烂,一点点调试出来的)
Algorithm
Longest Common Prefix
package org.nocoder.leetcode.solution;
/**
* Write a function to find the longest common prefix string amongst an array of strings.
* <p>
* If there is no common prefix, return an empty string "".
* <p>
* Example 1:
* <p>
* Input: ["flower","flow","flight"]
* Output: "fl"
* Example 2:
* <p>
* Input: ["dog","racecar","car"]
* Output: ""
* Explanation: There is no common prefix among the input strings.
* Note:
* <p>
* All given inputs are in lowercase letters a-z.
*
* @author jason
* @date 2018/9/23.
*/
public class LongestCommonPrefix {
public static String longestCommonPrefix(String[] strs) {
String commonPrefix = "";
if (strs == null || strs.length == 0) {
return commonPrefix;
}
if (strs.length == 1) {
commonPrefix = strs[0];
return commonPrefix;
}
// i: 代表数组下标
int i = 0;
// x: 数组元素中的字符串的下标
int x = 0;
while (i < strs.length) {
if ((x + 1) > strs[i].length() || (x + 1) > strs[i + 1].length()) {
return commonPrefix;
}
// 获取数组中下标为i字符串,并截取(x, x+1)位置的字符
String s = strs[i].substring(x, x + 1);
// 将s与下一个字符串中的相同位置的字符进行比较
if (s.equals(strs[i + 1].substring(x, x + 1))) {
if ((i + 1) == (strs.length - 1)) {
commonPrefix += s;
// 字符串下标右移一位
x++;
// 重置数组下标
i = 0;
} else {
i++;
}
} else {
return commonPrefix;
}
}
return commonPrefix;
}
public static void main(String[] args) {
String[] arr1 = new String[]{"flower", "flow", "flight"};
String[] arr2 = new String[]{"a", "a"};
System.out.println(longestCommonPrefix(arr1));
System.out.println(longestCommonPrefix(arr2));
}
}
Review
Understanding the Proxy Design Pattern
https://medium.com/@mithunsasidharan/understanding-the-proxy-design-pattern-5e63fe38052a
又一篇印度阿三的博客文章,哈哈,理解一下代理模式,作者列举了两个例子。
一个是新郎新娘之间的对话,中间有个Aunty在传话,她可以保护新娘免受新郎的一些令人反感的问题,也可以修改新郎的问题,或者修改新娘的回答。去新娘娘家接亲,在印度是这样,在中国也差不多吧,非得一大帮人给你在中间搅和一下,哈哈。
另一个例子是ATM作为银行支行的代理,来处理银行业务,比如取钱,查余额,当然ATM机没本事处理所有的银行业务,在实现Bank接口的某些方法时,作了简化或者其他处理,比如修改个人信息,可能只会提示一下用户,请持银行卡和证件到柜台操作。
Subject (Bank) : 银行通用接口
Real Subject (Bank Branch) : 实现接口的Real Subject
Proxy (ATM) : 代理类
代理模式的适用场景:
- 存在重量级对象,希望实现更简单的版本
- 不需要重量级对象的全部功能
- 想要限制对重量级对象的访问
- 创建重量级对象时有时间延迟或者非常复杂的时候
几个缺点:
- 身份比较 :不能进行身份比较,因为不知道确切的Real Subject,只是代理人。
- 歧义 :客户可能不知道它现在访问的Real Subject与前一个Subject不同。
- 安全问题:因为客户端不知道代理正在做什么,除了调用Real Subject。
Tip
新建的一个Springboot项目,准备部署到测试环境,java -jar xxx.jar
运行,得到如下提示
Failed to load Main-Class manifest attribute from xxx.jar
问题在于pom.xml
中,我虽然引入了spring-boot-maven-plugin
却没有配置repackage
,正确的配置如下
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
附上官方文档: 68. Spring Boot Maven Plugin
Share
代理模式(Proxy Pattern):静态代理 - 最易懂的设计模式解析 https://www.jianshu.com/p/a8aa6851e09e