ARTS-W03(1.03 - 1.09)

2021-01-12  本文已影响0人  寒沁

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

它的实现比以上的代码实现效率要高很多。
第二版的思路:双指针,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?

Tips(学习一个技术技巧)

今天分享一个小技巧:mac下面idea项目启动慢的解决方法
第一次使用macbook开发,在idea项目启动的时候,在build阶段,都会卡住好久,启动过程也非常的慢,碰到这种情况如何解决呢?

  1. 找到mac的电脑上名称
    系统偏好设置 --> 共享 --> 您的本地网络上的电脑可以通过以下地址访问您的电脑:xxx
  2. 通过终端,修改主机地址 sudo vim /etc/hosts 0
    127.0.0.1 localhost xxx

重新启动即可。

Share(分享一篇有观点有思考的技术文章)

  一路走来,做java也已经很多年了,提升有限,还是个菜鸡。原因很多,其中一个关键的原因就是想学的太多,太杂,都是浅尝而止。很多时候都是在同时做N件事情,做的事情又以完成为主,而“完成”通常都带有点水货,思考与摘抄参半,没有形成一个闭环。
  比如这次的文章,有不少是为了赶进度,为了完成而完成。Share原计划是写最近看同事写的责任链落地代码带有益处的思考,然而周末花时间在看《大秦赋》上,又不了了之了。
   在这里特别标注提醒下自己,花了时间的事情,要尽可能从中获取到益处,不能为了做而做。慢点没关系,简单点没关系,最重要的是做完之后,要有收获。或是思考过程,或是总结提炼,或是认真投入。

上一篇 下一篇

猜你喜欢

热点阅读