日常刷题0x24之未出新手村

166 阅读1分钟

如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想作为自律工具和朋友一起每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的

题号:1006
 var clumsy = function (N) {
     
    let stack = [], symbols = ['*', '/', '+', '-']
    while (N > 0) {
        if (stack.length == 0) {
            stack.push(N)
        } else {
            let _symbol = symbols.shift()
            if (_symbol === '*') {
                stack.push(stack.pop() * N)
            } else if (_symbol === '/') {
                //有个小问题可能要注意:正负数的floor和我一开始的认识不一样
                //floor不管正负其实都是取左边的值,但是题意的意思不是,题意
                //的意思是负数要左取,整数要右取
                // let pop = stack.pop()
                // if (pop > 0) {
                //     stack.push(Math.floor(pop/N))
                // } else {
                //     stack.push(Math.ceil(pop/N))
                // }

                //稍微调整下代码
                let pop = stack.pop()
                if (pop > 0) {
                    stack.push(Math.floor(pop/N))
                } else {
                    stack.push(-Math.floor(-pop/N))
                }
            } else if (_symbol === '+') {
                stack.push(N)
            } else {
                stack.push(-N)
            }
            symbols.push(_symbol)
        }
        N -= 1
    }
    let result = stack.reduce((total, curVal) => {
        return total + curVal
    })
    return result
};
题号:150
var evalRPN = function (tokens) {
    let symbols = ['*', '/', '+', '-'],stack = []
    for (let i = 0; i < tokens.length; i++) {
        let ele = tokens[i]
        if (symbols.includes(ele)) {
            //运算符开始计算
            let num2 = stack.pop()
            let num1 = stack.pop()
            switch (ele) {
                case '*':
                    stack.push(num1 * num2)
                    break;
                case '/':
                    stack.push(parseInt(num1/num2))
                    break;
                case '+':
                    stack.push(num1 + num2)
                    break;
                case '-':
                    stack.push(num1 - num2)
                    break;
                default:
                    break;
            }
        } else {
            //数字压栈
            stack.push(parseInt(ele))
        }
    }
    return stack.pop()
};
题号:227
var calculate = function (s) {

    //numStr用来记录数字字符串
    //result用来压栈运算之后的结果,最后result中都是乘除之后的结果相加即可
    //op记录最近的一个元素符号:如果是+那么当前数字直接放入result中如果是-就取
    //反放入,如果是 * /就取出上一个result记录的数字和当前的数字计算然后放入result
    let result = [], numStr = "", symbols = ['*', '/', '+', '-'], op = '+'
    let helper = (ele) => {
        if (ele === "") {
            return
        }
        switch (ele) {
            case '*':
                result.push(result.pop() * result.pop())
                break;
            case '/':
                let num2 = result.pop()
                let num1 = result.pop()
                result.push(parseInt(num1 / num2))
                break;
            case '+':
                result.push(result.pop())
                break;
            case '-':
                result.push(-result.pop())
                break;
            default:
                break;
        }
        op = ''
    }

    for (let i = 0; i < s.length; i++) {
        let ele = s[i]
        if (ele === '') {
            //空格
            if (numStr.length != 0) {
                result.push(parseInt(numStr))
                numStr = ""
                helper(op)
            }
            continue;
        } else if (symbols.includes(ele)) {
            //运算符
            if (numStr.length != 0) {
                result.push(parseInt(numStr))
                numStr = ""
                helper(op)
            }
            op = ele
        } else {
            //数字
            numStr += ele 
        }
    }
    //最后一个可能存在的数字
    if (numStr.length != 0) {
        result.push(parseInt(numStr))
        numStr = ""
        helper(op)
    }

    return result.reduce((total, curVal) => {
        return total + curVal
    })
};