ARTS打卡第三周(不重复字符串,统一日志,消息队列只消费一次)

2 篇文章 0 订阅
2 篇文章 0 订阅

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:

分享一篇唐扬老师关于[如何保证消息之投递一次]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值