代码随想录算法训练营第十一天 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值

60 阅读1分钟

20.有效的括号

1047.删除字符串中的所有相邻重复项

150.逆波兰表达式求值

消消乐合集~

20. 有效的括号

var isValid = function(s) {
    const map = {
        '(': ')',
        '[': ']',
        '{': '}'
    };

    const stk = [];
    for (const c of s) {
        if (Object.keys(map).find((a) => a===c)) {
            stk.push(c);
        } else {
            const last = stk.pop();
            if (map[last] !== c) {
                return false;
            }
        }
    }

    return stk.length === 0;
};

// 用右括号来匹配
for (const c of s) {
    if (map[c]) {
        stk.push(map[c]);
    } else {
        if (stk[stk.length-1] !== c) {
            return false;
        } else {
            stk.pop();
        }
    }
}

1047. 删除字符串中的所有相邻重复项

var removeDuplicates = function(s) {
    if (s.length === 1) return s;

    const res = [];
    for (const c of s) {
        if (res.length > 0) {
            const last = res.pop();
            if (last !== c) {
                res.push(last);
                res.push(c);
            }
        } else {
            res.push(c);
        }
    }

    return res.join('');
};

150. 逆波兰表达式求值

  • 注意点:运算符的顺序很重要;除法是直接截断的
var evalRPN = function(tokens) {
    const stk = [];
    for (const t of tokens) {
        if (!isNaN(+t)) {
            stk.push(t);
        } else {
            const b = +stk.pop();
            const a = +stk.pop();
            let c = null;
            switch(t) {
                case '+': {
                    c = a+b;
                    break;
                }
                case '-': {
                    c = a-b;
                    break;
                }
                case '*': {
                    c = a*b;
                    break;
                }
                case '/': {
                    c = parseInt(a/b);
                    break;
                }
            }
            stk.push(c);
        }
    }

    return stk.pop();
};