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:
分享一篇唐揚老師關於[如何保證消息之投遞一次]