- Algorithm。主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell。
- Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com(需要梯子)以及各个公司的技术blog,如Netflix的。
- Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。
- Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章
Algorithm 算法
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 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:
采用存储和计算分离的设计,是消息队里产品中黑马,值得持续关注