算法训练营(第一期)

算法训练营(第一期)第十天(java)

学习感悟:



题目


一、有效的括号(leetcode20)

题目

错误解法:使用hash法过程太过于复杂

class Solution {
    public boolean isValid(String s) {
        //本题可以使用hash表来解决
        char[] c=s.toCharArray();
        int[] a=new int[3];
        if(c.length%2!=0) return false;
        for(int i=0;i<c.length;i++){
            if(i%2!=0){
                if(c[i]!='}'&&c[i]!=')'&&c[i]!=']') return false;
            }
            if(c[i]=='('){
                a[0]++;
            }else if(c[i]=='['){
                a[1]++;
            }else if(c[i]=='{'){
                a[2]++;
            }else if(c[i]==')'){
                a[0]--;
            }
            else if(c[i]==']'){
                a[1]--;
            }
            else if(c[i]=='}'){
                a[2]--;
            }
        }
        for(int i=0;i<a.length;i++){
            if(a[i]!=0) {
                
                return false;
            }
        }
        return true;
    }
}

正确解法:使用栈来解决问题

class Solution {
    public boolean isValid(String s) {
        //本题采用栈的方式来解决问题.
         char[] c=s.toCharArray();
         Stack st=new Stack();
         for(int i=0;i<c.length;i++){
             if(c[i]=='('){
                st.push(')') ;
             }else if(c[i]=='{'){
                 st.push('}');
             }else if(c[i]=='['){
                 st.push(']');
             }else{
                 if(st.isEmpty()) return false;
                 char c1=(char)st.peek();
                 if(c1!=c[i]){
                     return false;
                 }else{
                     st.pop();
                 }
             }
         }
         if(st.isEmpty()) return true;
         else return false;
    }
}

二、删除字符串中的所有相邻重复项(leetcode1047)

题目
解法:

class Solution {
    public String removeDuplicates(String s) {
        //本题若是采用数组的方法比较麻烦涉及到移动位置,而且还不知道要移动多少次
        //那么就使用栈的方法
        char[] c=s.toCharArray();
        Stack st=new Stack();
        for(int i=0;i<c.length;i++){
            if(!st.isEmpty()){
                if(c[i]==(char)st.peek()){
                    st.pop();
                }else{
                    st.push(c[i]);
                }
            }else{
                st.push(c[i]);
            }
        }
        String s1="";
        while(!st.isEmpty()){
           char c1=(char)st.pop();
           s1+=c1;
        }
    return new StringBuffer(s1).reverse().toString();
    }
}

三、逆波兰表达式求值(leetcode150)

题目
麻烦且错误解法:

class Solution {
    public int evalRPN(String[] tokens) {
        //遇到这个题目我们应该先把题目理解清晰,这个题目的意思是没读入一个数字就压入栈中,每读入一个符号就弹出两个数字参与运算再压入栈中.那么这个题目显然就要使用栈了;
           
            Stack st=new Stack();
    for(int i=0;i<tokens.length;i++){
        //如果使用char数组没有String方便
            char[] c=tokens[i].toCharArray();   
            char m=c[0]; 
        if(m=='*'||m=='+'||m=='-'||m=='/'){
            int a=(int)((char)st.pop());
            if(st.isEmpty()) return a;
            int b=(int)((char)st.pop());
            int x=0;
            if(m=='*') x=a*b;
            if(m=='+') x=a+b;
            if(m=='-') x=a-b;
            if(m=='/') x=a/b;
            st.push((char)x);
        }else{
            st.push(m);
        }
    }
    return (int)((char)st.pop());
    }
}

正确且间接解法:

class Solution {
    public int evalRPN(String[] tokens) {
        //遇到这个题目我们应该先把题目理解清晰,这个题目的意思是没读入一个数字就压入栈中,每读入一个符号就弹出两个数字参与运算再压入栈中.那么这个题目显然就要使用栈了;
           //利用泛型可以帮助我们进行类型的限定
            Stack<Integer> st=new Stack();
    for(int i=0;i<tokens.length;i++){
        //如果使用char数组没有String方便
            if(tokens[i].equals("+")){
                st.push(st.pop() + st.pop());
            }
            else if(tokens[i].equals("-")){
                st.push(-st.pop() + st.pop());
            }
             else if(tokens[i].equals("*")){
                 st.push(st.pop()*st.pop());
             }
              else if(tokens[i].equals("/")){
                  int temp1=st.pop();
                  int temp2=st.pop();
                  st.push(temp2/temp1);
              }else{
                  st.push(Integer.valueOf(tokens[i]));
              }
    
    }
    return st.pop();
}}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值