ARTS 第12周 - 0722

  • Algorithm主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell。
  • Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com(需要梯子)以及各个公司的技术blog,如Netflix的。
  • Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。
  • Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章

打卡地址

 

Algorithm 算法

125. 验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:

输入: "race a car"
输出: false

 

方法1 :循环

    public static  boolean isPalindrome2(String s) {
        boolean flag = true;
        if (s == null || "".equals(s)) {
            return flag;
        }
        char[] chars = s.toCharArray();
        String ss = "";
        for (int i = 0; i < chars.length; i++) {
            if (chars[i]>=65 && chars[i]<=90) {
                // 大写转字母.
                ss += Character.toLowerCase(chars[i]);
            } else if (chars[i]>=48 && chars[i]<=57) {
                // 数字.
                ss += chars[i];
            } else if (chars[i]>=97 && chars[i]<=122) {
                // 数字.
                ss += chars[i];
            }
        }
        for (int i = 0; i < ss.length()/2; i++) {
            if(ss.charAt(i) != ss.charAt(ss.length() - i - 1)) {
                return false;
            }
        }
        return flag;
    }

最开始想到的就是先遍历,去除不比较的字符,大写转小写,然后再进行回文串的比较。

当然,最后超时了。

 

方法2:正则

    public static boolean isPalindrome3(String s) {
        boolean flag = true;
        if (s == null || "".equals(s)) {
            return flag;
        }
        s = s.replaceAll("[^a-zA-Z0-9]","").toLowerCase();
        for (int i = 0; i < s.length()/2; i++) {
            if(s.charAt(i) != s.charAt(s.length() - i - 1)) {
                return false;
            }
        }
        return flag;
    }

正则这个倒是通过了,击败14.63%的用户,因此这明显也不是一个好的方法。

 

方法3:双向指针

    public static  boolean isPalindrome(String s) {
        boolean flag = true;
        if (s == null || "".equals(s)) {
            return flag;
        }
        int start = 0;
        int end = s.length()-1;
        while (start <= end) {
            if (!((s.charAt(start) >= 'a' && s.charAt(start) <= 'z')
                    || (s.charAt(start) >= 'A' && s.charAt(start) <= 'Z')
                    || (s.charAt(start) >= '0' && s.charAt(start) <= '9'))) {
                start++;
                continue;
            }
            if (!((s.charAt(end) >= 'a' && s.charAt(end) <= 'z')
                    || (s.charAt(end) >= 'A' && s.charAt(end) <= 'Z')
                    || (s.charAt(end) >= '0' && s.charAt(end) <= '9'))) {
                end--;
                continue;
            }
            if (Character.toLowerCase(s.charAt(start)) == Character.toLowerCase(s.charAt(end))) {
                start++;
                end--;
            } else {
                return false;
            }
        }
        return flag;
    }

这种双向指针的写法,边判断边比较,左边索引不大于右边索引。

 

 

 

 

 

 

Review 回顾

暂无

 

Tip 知识点

MySQL的原子性

 

CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB;
BEGIN;
INSERT INTO test SELECT '关羽';

BEGIN;
INSERT INTO test SELECT '张飞';
INSERT INTO test SELECT '张飞';
ROLLBACK;
SELECT * FROM test;

运行结果(1 行数据):关羽

 

在 MySQL 中 BEGIN 用于开启事务,如果是连续 BEGIN,当开启了第一个事务,还没有进行 COMMIT 提交时,会直接进行第二个事务的 BEGIN,这时数据库会隐式地 COMMIT 第一个事务,然后再进入到第二个事务

 

第二个是插入两次”张飞”,name为主键,主键唯一,插入两次”张飞”就会产生错误,因此在提交的时候,根据事务的“原子性”原则,要么全部成功,要么全部失败,也就是说第二个事务是失败的,会进行自动回滚。

 

 

Share分享

该如何选择消息队列?

rabbitmq:
优点:轻量,迅捷,容易部署和使用,拥有灵活的路由配置
缺点:性能和吞吐量较差,不易进行二次开发


rocketmq:
优点:性能好,稳定可靠,有活跃的中文社区,特点响应快
缺点:兼容性较差,但随意影响力的扩大,该问题会有改善


kafka:
优点:拥有强大的性能及吞吐量,兼容性很好
缺点:由于“攒一波再处理”导致延迟比较高


pulsar:
采用存储和计算分离的设计,是消息队里产品中黑马,值得持续关注

 

 

你可能感兴趣的:(java,ARTS)