Algorithm(一道算法题)
验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
认真阅读题目(快速理解题目也是一种能力),很快知道,除去字符串和数字作为回文串,其他的都可以忽略,从左往右与从右到左读取到的字符串是一样的。
第一版本思路如下:将字符串转化成char串,遍历char[ ],筛选出字母和数字,并将字母统一转化成大写(小写),遍历的时候同时用StringBuffer拼接成str1及放入栈中,之后再遍历一遍栈,拼接成str2,比较str1与str2是否一致。
代码如下
public static boolean isPalinerome2(String str){
if(str.isEmpty()){
return true;
}
char[] chars = str.toCharArray();
Stack<String> stack1 = new Stack<>();
StringBuffer s1 = new StringBuffer();
StringBuffer s2 = new StringBuffer();
for(char c : chars){
int asc_value = Integer.valueOf(c);
if( (asc_value >= 48 && asc_value <= 57) || (asc_value >= 65 && asc_value <= 90) ||
(asc_value >= 97 && asc_value <= 122)){
if(asc_value >= 65 && asc_value <= 90){
asc_value = asc_value+32 ;
}
stack1.push((char)asc_value+"");
s1.append((char)asc_value+"");
}
}
while(!stack1.empty()){
s2.append(stack1.pop());
}
if(s1.toString().equals(s2.toString())){
return true;
}
return false;
}
结果运行下来,执行耗时与空间内存用的都很高。这种写法能想到的优化点,就是大小写转化这一块,可以用上二进制的形式来做。jdk中提供了两个api
- StringBuffer.reverse 翻转StringBuffer值
- isLetterOrDigit(char a) 判断是否是数字或者字母
它的实现比以上的代码实现效率要高很多。
第二版的思路:双指针,1个从头位置,1个从尾位置,相向移动,都遇到数字和字母比较,则比较是否相等,相等继续移动,最后判断两指针是否相遇,能相遇说明是回文。
代码如下
public static boolean isPalindromeTwo_1(String s){
int left = 0;
int right = s.length()-1;
while(left < right){
if(!Character.isLetterOrDigit(s.charAt(left)) || !Character.isLetterOrDigit(s.charAt(right))){
if(!Character.isLetterOrDigit(s.charAt(left))){
left++;
}
if(!Character.isLetterOrDigit(s.charAt(right))){
right--;
}
continue;
}
if(Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))){
return false;
}
left++;
right--;
}
return true;
}
以上方法,不管空间还是时间利用率都要优于方法一
Review(阅读并点评一篇英语技术文章)
How is the Apple M1 going to affect Machine Learning?
- Introduction 大致介绍了苹果自研台式和笔记本等pc机器的cpu , M1芯片,并且已经在三款机器上使用,很多方面都取得了好几倍的效果,它着重强调了续航能力。
- M1 Architecture M1架构最突出的点:“Since the RAM is built into the processor, all components access the same memory” (
)
- CPU单核效率远高于Inter与AMD,单核性能最好的cpu
- Neural Engine 集成在处理器中的神经引擎,神经引擎之前只集成在iphone、ipad等A系列处理器中。
- M1的软件支持
Tensorflow:端到端的开源机器学习平台
Scikit-Learn:python的机器学习
Tips(学习一个技术技巧)
今天分享一个小技巧:mac下面idea项目启动慢的解决方法
第一次使用macbook开发,在idea项目启动的时候,在build阶段,都会卡住好久,启动过程也非常的慢,碰到这种情况如何解决呢?
- 找到mac的电脑上名称
系统偏好设置 --> 共享 --> 您的本地网络上的电脑可以通过以下地址访问您的电脑:xxx - 通过终端,修改主机地址 sudo vim /etc/hosts 0
127.0.0.1 localhost xxx
重新启动即可。
Share(分享一篇有观点有思考的技术文章)
一路走来,做java也已经很多年了,提升有限,还是个菜鸡。原因很多,其中一个关键的原因就是想学的太多,太杂,都是浅尝而止。很多时候都是在同时做N件事情,做的事情又以完成为主,而“完成”通常都带有点水货,思考与摘抄参半,没有形成一个闭环。
比如这次的文章,有不少是为了赶进度,为了完成而完成。Share原计划是写最近看同事写的责任链落地代码带有益处的思考,然而周末花时间在看《大秦赋》上,又不了了之了。
在这里特别标注提醒下自己,花了时间的事情,要尽可能从中获取到益处,不能为了做而做。慢点没关系,简单点没关系,最重要的是做完之后,要有收获。或是思考过程,或是总结提炼,或是认真投入。
网友评论