Published on

ARTS 第12周

Authors

小伙伴们中秋节快乐!终于可以放松几天,这两天带着老婆孩子玩疯了,满成都到处跑,当然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