ARTS打卡第二週(不重複字符串,統一日誌,消息隊列只消費一次)

1. Algorithm:

難度:中等
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。

示例 1:

輸入: “abcabcbb”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “abc”,所以其長度爲 3。
示例 2:

輸入: “bbbbb”
輸出: 1
解釋: 因爲無重複字符的最長子串是 “b”,所以其長度爲 1。
示例 3:

輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。

  • 這道題我看到不重複第一反應是用hashmap來做.遍歷一遍代碼如下
class Solution {
    public int lengthOfLongestSubstring(String s) {
         int maxLength = 0;
        Map map = new HashMap<String, String>();
        for (int i = 0; i < s.length(); i++) {
            if (!map.containsKey(s.charAt(i))) {
                map.put(s.charAt(i), i);
            } else {
                if (map.size()>maxLength) {
                    maxLength = map.size();
                }
                i = (int)map.get(s.charAt(i));
                map.clear(); //記錄下length,找到相同字符的位置,並清空map,並從charAt開始遍歷
            }

        }
        return map.size()>maxLength?map.size():maxLength;
    }
}

看了大佬的題解,感覺有幾點需要改進,這種只關心長度,我們只需要定義兩個指針就可以了.頭指針永遠指向最新值,尾指針指向不重複的最新值.這樣頭-尾就是我們需要的長度.

   public int lengthOfLongestSubstring(String s) {
          int max = 0;
        int start = 0, end = 0; //定義前指針,後指針指向最新的值,後指針指向不重複的最小下標
        //定義map來標定是否有元素重複,如果重複就移動後指針到不重複的最小下標,
        Map map = new HashMap<Character, Integer>(16);
        while(start < s.length()) {
            char c = s.charAt(start);
            if (map.containsKey(c)) {//如果包括,證明後指針到前指針位置之後的長度爲最大
                //拿到當前的不重複長度和max做比較.
                max = Math.max(max,start-end);
                //更新後指針,如果比後指針當前位置靠左就是冗餘數據,指針不更新.
                end = Math.max((int)map.get(c)+1,end);
            }
            //更新map的最新value值
            map.put(c, start);
            start++;
        }

        //否則返回,前指針到後指針位置和max中的較大值
        return Math.max(max,start-end);
    }

2.Review:

翻譯單獨寫成博客以後.

3.Tip:

這周分享一個關於線上統一日誌的方式.
背景:log4j2+slf4j線上日誌太多,無法知道哪個請求對應哪個響應.無法一步步定位日誌.
解決方式:

使用aop的方式,定義統一切面.使用log4j的MDC自定義變量,在before中生成requestId(唯一標識),在after中remove掉.並在log4j的規則中配置統一變量.這樣就在不改變原有代碼邏輯下,優雅的配置了統一日誌!!

4.Share:

分享一篇唐揚老師關於[如何保證消息之投遞一次]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章